Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.68/22: Рейтинг темы: голосов - 22, средняя оценка - 4.68
 Аватар для BullDogoff
10 / 10 / 1
Регистрация: 16.05.2009
Сообщений: 30

Переопределение операторов

16.05.2009, 10:07. Показов 4793. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток..
В древние времена, когда ещё жили мамонты, ковырял я потихоньку плюсы.. Потом был долгий перерыв, и, как итог - забыл всё нафиг
Теперь вспоминается, но до того медленно и печально..
Ситуация такая - описываю класс точки (Point). Переопределил приравнивание, пытаюсь переопределить сложение - ругается..
Листинг:

Point.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
//Îïðåäåëåíèå êëàññà, îïèñûâàþùåãî òî÷êó
 
class Point
{
public:
    Point operator=(Point);                    //Îïåðàòîð ïðèñâàèâàíèÿ
    Point operator+(Point);                    //Îïåðàòîð ñëîæåíèÿ
    
    Point();                                   //Êîíñòðóêòîð ïî óìîë÷àíèþ
    Point(Point&);                             //Êîíñòðóêòîð êîïèè
    Point(double, double, double);             //Êîíñòðóêòîð ïðîèçâîëüíîé òî÷êè
    double x, y, z;                            //Êîîðäèíàòû äîñòóïíû êëèåíòàì êëàññà
};
Point.cpp
Конструкторы (три штуки) опустил..
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//Описание функций-элементов класса Point
#include "point.h"
 
//Здесь были конструкторы
 
Point Point::operator=(Point i)
{
    x = i.x;
    y = i.y;
    z = i.z;
 
    return *this;
}
 
Point Point::operator+(Point i)
{
    Point q;
 
//Здесь собственно код сложения координат двух точек и приравнивание q результату
    
    return q;
}
Матерится на строку 17 в Point.cpp такими словами:
"error C2668: 'Point::Point' : ambiguous call to overloaded function"

Пространно, конечно, зато полная картина бедствия.. Скажите что-нибудь умное

З.Ы.: Я в курсе, что всё это уже написано и присутствует в стандартных хедерах, просто охота вручную.. ВотЪ!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.05.2009, 10:07
Ответы с готовыми решениями:

переопределение операторов
Стоит следующая задача. Надо сделать массив чар, которые представляют собой строку (специально делать так, а не через string) и надо...

переопределение операторов
Писал прогу с переопределнием операторов, всё работало, теперь когда мне понадобилась та либа, в ней ничего не работает =( ...

Переопределение операторов С++
Помогите разобраться с переопределением операторов, как что и куда записывается, какие параметры. Если можно, ссылку на полезную статью, в...

12
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
16.05.2009, 11:58
У меня съело. У тебя что за компилятор?
0
Заблокирован
16.05.2009, 11:59
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Point{
    double x, y, z;   
public:
    Point & operator = (Point &i);                    //Оператор присваивания
    Point & operator + (Point &i);                    //Оператор сложения
    Point(){};                                   //Конструктор по умолчанию
    Point(Point&){};                             //Конструктор копии
    Point(double, double, double){};             //Конструктор произвольной точки
};
 
Point & Point::operator=(Point &i){
    x = i.x;
    y = i.y;
    z = i.z;
    return *this;
}
Point & Point::operator+(Point &i){
    Point *q=new Point();   
    return *q;
}
а вообще и так работает вроде
1
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
16.05.2009, 12:02
Как вариант можешь попробовать агрументы операторов делать в виде ссылок (что более правильно)
0
 Аватар для BullDogoff
10 / 10 / 1
Регистрация: 16.05.2009
Сообщений: 30
16.05.2009, 12:20  [ТС]
Компилятор MS Visual C++ 5.0
Попробую по ссылке, по указателю.. Увидим..
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
16.05.2009, 12:35
5-го нет, но 6-ой тоже съел
Когда ты пишешь операторы с аргументом по значению (т.е. без ссылки), то в моменте передачи аргумента делается копия объекта (т.е. вызывается copy-конструктор). Покажи на всякий случай код конструкторов, может там ухитрился накосячить?
0
 Аватар для BullDogoff
10 / 10 / 1
Регистрация: 16.05.2009
Сообщений: 30
16.05.2009, 12:39  [ТС]
Попробовал.. Матерится, скотина..
Пробовал объявлять внешнюю функцию сложения (координаты-то public) и вызывать её из тела переопределения оператора - всё равно ругается.. На то же самое объявление, только в другом месте.. Чудеса бывают? По-моему - нет..

Конструкторы:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Point::Point()
{
    x = y = z = 0;
}
 
Point::Point(Point& i)
{
    x = i.x;
    y = i.y;
    z = i.z;
}
 
Point::Point(double a = 0, double b = 0, double c = 0)
{
    x = a;
    y = b;
    z = c;
}
Все три работают как надо, проверял..

З.Ы.: А если я конструктор копии не переопределял, как он аргумент по значению передавать будет?.. Или я чего-то не догнал?
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
16.05.2009, 13:00
Цитата Сообщение от BullDogoff Посмотреть сообщение
З.Ы.: А если я конструктор копии не переопределял, как он аргумент по значению передавать будет?.. Или я чего-то не догнал?
Если ты не создал, то компилятор сам создаст default copy constructor, в котором создаст код для копирования всех полей

Что-то у тебя какое-то шаманство творится. Выложи пожалуйста полные версии твоих исходников. Может что-то за кадром осталось?

Добавлено через 1 минуту 55 секунд
И напиши, как ты проект создавал
1
 Аватар для BullDogoff
10 / 10 / 1
Регистрация: 16.05.2009
Сообщений: 30
16.05.2009, 13:24  [ТС]
Вот исходники полностью - три файла..

point.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
//Îïðåäåëåíèå êëàññà, îïèñûâàþùåãî òî÷êó
 
class Point
{
public:
    Point operator=(Point);                    //Îïåðàòîð ïðèñâàèâàíèÿ
    Point operator+(Point);                    //Îïåðàòîð ñëîæåíèÿ
    
    Point();                                   //Êîíñòðóêòîð ïî óìîë÷àíèþ
    Point(Point&);                             //Êîíñòðóêòîð êîïèè
    Point(double, double, double);             //Êîíñòðóêòîð ïðîèçâîëüíîé òî÷êè
    double x, y, z;                            //Êîîðäèíàòû äîñòóïíû êëèåíòàì êëàññà
};
point.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
//Îïèñàíèå ôóíêöèé-ýëåìåíòîâ êëàññà Point
#include "point.h"
 
///////////////////////////////////////////////////////////////////////////////////
//Êîíñòðóêòîðû
///////////////////////////////////////////////////////////////////////////////////
 
Point::Point()
{
    x = y = z = 0;
}
 
Point::Point(Point& i)
{
    x = i.x;
    y = i.y;
    z = i.z;
}
 
Point::Point(double a = 0, double b = 0, double c = 0)
{
    x = a;
    y = b;
    z = c;
}
 
///////////////////////////////////////////////////////////////////////////////////
//Îïåðàòîðû
///////////////////////////////////////////////////////////////////////////////////
 
Point Point::operator=(Point i)
{
    x = i.x;
    y = i.y;
    z = i.z;
 
    return *this;
}
 
Point Point::operator+(Point i)
{
    Point* q = new Point();
 
//Собственно здесь ничего нет, но оно обязательно там появится, как только объявлю экземпляр класса
    
    return *q;
}
main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream.h>
#include <iomanip.h>
#include "point.h"
 
 
main()
{
    Point i, k, l;
 
    k.x = 1;
    k.y = 2;
    k.z = 3;
 
    cout<<"i("<<i.x<<", "<<i.y<<", "<<i.z<<");\n";
    cout<<"k("<<k.x<<", "<<k.y<<", "<<k.z<<");\n\n";
 
    i = k;
 
    cout<<"i("<<i.x<<", "<<i.y<<", "<<i.z<<");\n";
    cout<<"k("<<k.x<<", "<<k.y<<", "<<k.z<<");\n\n";
 
    return 0;
}
Проект создавал как полагается, New->Project->Win32 Console Application.
В функции переопределения передавал значение, ссылку, указатель - ноль эмоций..
Ругается на любое объявление экземпляра класса в функциях-элементах, в функциях, вызываемых из оных..
Статическое выделение памяти, динамическое - пофигу.. Всё чудесатее и чудесатее, блин..
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
16.05.2009, 13:44
У тебя возникает неопределённость между первым и третьим конструкторами. В третьем конструкторе у первого параметра убери дефолтное значение

Добавлено через 11 минут 7 секунд
И вообще, дефолтные значения параметров нужно описывать внутри класса. В противном случае подцепив один лишь point.h, у тебя не будет работать конструктор с одним или двумя параметрами (т.к. внутри класса описан конструктор с тремя параметрами). Ну и сами x,y,z надо упрятать в private (или protected) часть
1
 Аватар для BullDogoff
10 / 10 / 1
Регистрация: 16.05.2009
Сообщений: 30
16.05.2009, 13:59  [ТС]
Не допёр, спасибо Всё робит..

Координаты в private не стал прятать вполне осознанно, просто каждый раз вызывать функцию для доступа к ним как-то.. Муторно

Насчёт дефолтных значений внутри класса поясни, пожалуйста..
Конструкцию типа:
C++
1
2
3
4
class T
{
    int x = 0;
};
использовать вроде нельзя..
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
16.05.2009, 14:15
Цитата Сообщение от BullDogoff Посмотреть сообщение
Координаты в private не стал прятать вполне осознанно, просто каждый раз вызывать функцию для доступа к ним как-то.. Муторно
Как бы это сказать... Не по пацански это К тому же плагается, что если ты завёл объект типа point, то ты и всё остальное будешь делать через этот объект. Т.е. получается у тебя некая абстракция, с которой координаты по отдельности ты берёшь только в крайних случаях. Идеальным вариантом было бы разрешить читать напрямую, но записывать только через метод, только хз как это делается

Цитата Сообщение от BullDogoff Посмотреть сообщение
Насчёт дефолтных значений внутри класса поясни, пожалуйста..
Конструкцию типа:
C++
1
2
3
4
class T
{
    int x = 0;
};
использовать вроде нельзя..
Внутри класса нельзя писать никаких дефолтных значений. Все дефолтные значения должны инициализироваться внутри конструкторов
1
 Аватар для BullDogoff
10 / 10 / 1
Регистрация: 16.05.2009
Сообщений: 30
16.05.2009, 15:02  [ТС]
Цитата Сообщение от Evg Посмотреть сообщение
Идеальным вариантом было бы разрешить читать напрямую, но записывать только через метод, только хз как это делается
Вот-вот, это было бы как раз то, что мне надо.. Мож где и накопаю, как это сделать..
Просто когда я доберусь до стадии Объекта (class Object), а он состоит из Массы (class Mass) и двух Векторов (class Vector).. А каждый Вектор из двух Точек..
Иной раз на улицу выходишь и думаешь - вот, блин, и ведь без всяких 3D-ускорителей
Ладно, флужу уже..

З.Ы.: А может, возьмусь как-нибудь - и Life3D напишу.. ВооотЪ..
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.05.2009, 15:02
Помогаю со студенческими работами здесь

Переопределение операторов
Еще раз об этом интересном вопросе. У меня есть матрицы , условно назовём их тип matrix, есть библиотека, имеющая в своём составе функции...

Переопределение операторов
Плиз помогите сделать задачку.. Написать класс StrangeInt для которого нижеследующий код StrangeInt x = 5; StrangeInt y = 3; ...

Переопределение операторов и массивы
Task* operator+=(Task *newTasks) { Task *finalTask = tasks + newTasks; } Error: 1 IntelliSense: выражение должно...

Создать класс строку в С++. Переопределение операторов
Доброго времени суток. Подскажите пожалуйста в чём ошибка в операторе &gt;&gt;. Когда его вызываю в основной программе, то почему-то компилятор...

Возможно ли переопределение операторов для пользовательских типов?
Собственно преследуемая цель: Определить свой тип int - myint. Переопределить для него операторы как надо. Ну, например, надо мне при...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru