Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 26, средняя оценка - 4.77
BullDogoff
10 / 10 / 1
Регистрация: 16.05.2009
Сообщений: 30
#1

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

16.05.2009, 10:07. Просмотров 3550. Ответов 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"

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

З.Ы.: Я в курсе, что всё это уже написано и присутствует в стандартных хедерах, просто охота вручную.. ВотЪ!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Evg
Эксперт CАвтор FAQ
17265 / 5519 / 343
Регистрация: 30.03.2009
Сообщений: 15,022
Записей в блоге: 26
16.05.2009, 11:58     Переопределение операторов #2
У меня съело. У тебя что за компилятор?
rrrFer
Заблокирован
16.05.2009, 11:59     Переопределение операторов #3
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;
}
а вообще и так работает вроде
Evg
Эксперт CАвтор FAQ
17265 / 5519 / 343
Регистрация: 30.03.2009
Сообщений: 15,022
Записей в блоге: 26
16.05.2009, 12:02     Переопределение операторов #4
Как вариант можешь попробовать агрументы операторов делать в виде ссылок (что более правильно)
BullDogoff
10 / 10 / 1
Регистрация: 16.05.2009
Сообщений: 30
16.05.2009, 12:20  [ТС]     Переопределение операторов #5
Компилятор MS Visual C++ 5.0
Попробую по ссылке, по указателю.. Увидим..
Evg
Эксперт CАвтор FAQ
17265 / 5519 / 343
Регистрация: 30.03.2009
Сообщений: 15,022
Записей в блоге: 26
16.05.2009, 12:35     Переопределение операторов #6
5-го нет, но 6-ой тоже съел
Когда ты пишешь операторы с аргументом по значению (т.е. без ссылки), то в моменте передачи аргумента делается копия объекта (т.е. вызывается copy-конструктор). Покажи на всякий случай код конструкторов, может там ухитрился накосячить?
BullDogoff
10 / 10 / 1
Регистрация: 16.05.2009
Сообщений: 30
16.05.2009, 12:39  [ТС]     Переопределение операторов #7
Попробовал.. Матерится, скотина..
Пробовал объявлять внешнюю функцию сложения (координаты-то 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;
}
Все три работают как надо, проверял..

З.Ы.: А если я конструктор копии не переопределял, как он аргумент по значению передавать будет?.. Или я чего-то не догнал?
Evg
Эксперт CАвтор FAQ
17265 / 5519 / 343
Регистрация: 30.03.2009
Сообщений: 15,022
Записей в блоге: 26
16.05.2009, 13:00     Переопределение операторов #8
Цитата Сообщение от BullDogoff Посмотреть сообщение
З.Ы.: А если я конструктор копии не переопределял, как он аргумент по значению передавать будет?.. Или я чего-то не догнал?
Если ты не создал, то компилятор сам создаст default copy constructor, в котором создаст код для копирования всех полей

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

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

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.
В функции переопределения передавал значение, ссылку, указатель - ноль эмоций..
Ругается на любое объявление экземпляра класса в функциях-элементах, в функциях, вызываемых из оных..
Статическое выделение памяти, динамическое - пофигу.. Всё чудесатее и чудесатее, блин..
Evg
Эксперт CАвтор FAQ
17265 / 5519 / 343
Регистрация: 30.03.2009
Сообщений: 15,022
Записей в блоге: 26
16.05.2009, 13:44     Переопределение операторов #10
У тебя возникает неопределённость между первым и третьим конструкторами. В третьем конструкторе у первого параметра убери дефолтное значение

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

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

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

Цитата Сообщение от BullDogoff Посмотреть сообщение
Насчёт дефолтных значений внутри класса поясни, пожалуйста..
Конструкцию типа:
C++
1
2
3
4
class T
{
    int x = 0;
};
использовать вроде нельзя..
Внутри класса нельзя писать никаких дефолтных значений. Все дефолтные значения должны инициализироваться внутри конструкторов
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.05.2009, 15:02     Переопределение операторов
Еще ссылки по теме:

Возможно ли переопределение операторов для пользовательских типов? C++
C++ Переопределение операторов, создание класса "Матрица"
C++ Переопределение операторов и массивы
C++ Что такое "перегрузка операторов"? Каковы принципы работы перегруженных операторов и назначение указателя this
C++ Задача с использованием логических операторов и операторов ветвления

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

Или воспользуйтесь поиском по форуму:
BullDogoff
10 / 10 / 1
Регистрация: 16.05.2009
Сообщений: 30
16.05.2009, 15:02  [ТС]     Переопределение операторов #13
Цитата Сообщение от Evg Посмотреть сообщение
Идеальным вариантом было бы разрешить читать напрямую, но записывать только через метод, только хз как это делается
Вот-вот, это было бы как раз то, что мне надо.. Мож где и накопаю, как это сделать..
Просто когда я доберусь до стадии Объекта (class Object), а он состоит из Массы (class Mass) и двух Векторов (class Vector).. А каждый Вектор из двух Точек..
Иной раз на улицу выходишь и думаешь - вот, блин, и ведь без всяких 3D-ускорителей
Ладно, флужу уже..

З.Ы.: А может, возьмусь как-нибудь - и Life3D напишу.. ВооотЪ..
Yandex
Объявления
16.05.2009, 15:02     Переопределение операторов
Ответ Создать тему
Опции темы

Текущее время: 06:12. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru