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

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

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

Author24 — интернет-сервис помощи студентам
Доброго времени суток..
В древние времена, когда ещё жили мамонты, ковырял я потихоньку плюсы.. Потом был долгий перерыв, и, как итог - забыл всё нафиг
Теперь вспоминается, но до того медленно и печально..
Ситуация такая - описываю класс точки (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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.05.2009, 10:07
Ответы с готовыми решениями:

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

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

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

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

12
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
16.05.2009, 11:58 2
У меня съело. У тебя что за компилятор?
0
Заблокирован
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;
}
а вообще и так работает вроде
1
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
16.05.2009, 12:02 4
Как вариант можешь попробовать агрументы операторов делать в виде ссылок (что более правильно)
0
10 / 10 / 1
Регистрация: 16.05.2009
Сообщений: 30
16.05.2009, 12:20  [ТС] 5
Компилятор MS Visual C++ 5.0
Попробую по ссылке, по указателю.. Увидим..
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
16.05.2009, 12:35 6
5-го нет, но 6-ой тоже съел
Когда ты пишешь операторы с аргументом по значению (т.е. без ссылки), то в моменте передачи аргумента делается копия объекта (т.е. вызывается copy-конструктор). Покажи на всякий случай код конструкторов, может там ухитрился накосячить?
0
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;
}
Все три работают как надо, проверял..

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

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

Добавлено через 1 минуту 55 секунд
И напиши, как ты проект создавал
1
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.
В функции переопределения передавал значение, ссылку, указатель - ноль эмоций..
Ругается на любое объявление экземпляра класса в функциях-элементах, в функциях, вызываемых из оных..
Статическое выделение памяти, динамическое - пофигу.. Всё чудесатее и чудесатее, блин..
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
16.05.2009, 13:44 10
У тебя возникает неопределённость между первым и третьим конструкторами. В третьем конструкторе у первого параметра убери дефолтное значение

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

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

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

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

З.Ы.: А может, возьмусь как-нибудь - и Life3D напишу.. ВооотЪ..
0
16.05.2009, 15:02
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.05.2009, 15:02
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru