Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
Banddk
38 / 38 / 2
Регистрация: 08.12.2012
Сообщений: 157
Записей в блоге: 1
#1

Перегрузка операторов 2 - C++

21.09.2013, 21:49. Просмотров 555. Ответов 14
Метки нет (Все метки)

Пишу класс комплексных чисел. И возникла проблема.Я перегрузил операторы +-*/. Но когда использую их в строке типа a=b+c*d - где все переменные комплексные возникает проблема.Но когда я пишу a=c*d; a=a+b; так все работает. Подскажите как это исправить пожалуйста
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.09.2013, 21:49
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Перегрузка операторов 2 (C++):

Что такое "перегрузка операторов"? Каковы принципы работы перегруженных операторов и назначение указателя this - C++
Добрый день . Помогите понять принцип работы перегрузки операторов. объясните пожалуйста в зависимости от чего зависит агрумент при...

Перегрузка операторов - C++
Создайте класс Fraction (обыкновенная дробь), в котором реализовать перегрузку: оператора суммирования дробей, оператора суммирования дроби...

[c++] Перегрузка операторов - C++
Для заданных A = (A – a1, A, A + a2) и B = (B – b1, B, B + b2) Найти сумму A + B = (A + B – a1 – b1, A + B, A + B + a2 + b2); ...

Перегрузка операторов - C++
Помогите, пожалуйста, с перегрузкой операторов +, >=, ++ как member и friend. void main() { pQueue Obj1, Obj2; String S1, S2;...

Перегрузка операторов - C++
Создать следующие классы. В каждом классе должны быть наборы конструкторов (в том числе по умолчанию и копирования), деструктор. Для...

Перегрузка операторов - C++
Столкнулся с проблемой при написании лабораторной по перегрузке операторов. Задание таково: описать класс, содержащий координаты отрезка,...

14
egor2116
450 / 374 / 42
Регистрация: 20.01.2013
Сообщений: 1,133
21.09.2013, 22:19 #2
Покажите перегруженные операторы
0
Banddk
38 / 38 / 2
Регистрация: 08.12.2012
Сообщений: 157
Записей в блоге: 1
21.09.2013, 22:27  [ТС] #3
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
class complex{
    public:
    double x,y;
    complex(){
        x=0;
        y=0;
    };
    complex(double a,double b){
        x=a;
        y=b;
    }
    complex operator+(complex& t){
        return complex(x+t.x,y+t.y);
    }
    complex operator-(complex& t){
        return complex(x-t.x,y-t.y);
    }
    complex operator*(complex& t){
        return complex(x*t.x-y*t.y,x*t.y+y*t.x);//???
    }
    //complex & operator=(complex& t){
    //x=t.x;
    //y=t.y;
    //return *this;
    //}
    complex operator+=(complex& t){
        x += t.x;
        y += t.y;
        return *this;
    }
    complex operator-=(complex& t){
        x -= t.x;
        y -= t.y;
        return *this;
    }
 
    complex operator/(complex& t){
        return complex((x*t.x+y*t.y)/(t.x*t.x+t.y*t.y),(y*t.x-x*t.y)/(t.x*t.x+t.y*t.y));
        
    }
    double module(){
        return(sqrt(x*x+y*y));
    }
    double arg(){
        return atan2(y,x);
    }
    friend complex sqrt(complex &t){
        return(complex(sqrt(t.module())*cos(t.arg()/2),sqrt(t.module())*sin(t.arg()/2)));
    };
 
    
    
};
 
ostream &operator<<(ostream &out, complex t)
{
    out<<t.x;
    if(t.y!=0)
        cout<<"+i"<<t.y;
    
    return out;
}
 
istream &operator>>(istream &in, complex &t)
{
    cout<<"RealPart\n>";
    in >> t.x;
    cout<<"ImagePart\n>";
    in>>t.y;
    return in;
}
Добавлено через 1 минуту
И можно еще сразу вопрос тогда. для того что бы мое комплексное умножалось на тип double. Надо еще раз перегружать оператор?
0
egor2116
450 / 374 / 42
Регистрация: 20.01.2013
Сообщений: 1,133
21.09.2013, 23:01 #4
Надо еще раз перегружать оператор?
да
в строке типа a=b+c*d - где все переменные комплексные возникает проблема
а в чем именно проблема ?
1
Banddk
38 / 38 / 2
Регистрация: 08.12.2012
Сообщений: 157
Записей в блоге: 1
22.09.2013, 00:34  [ТС] #5
не компилируется ( Пишет "invalid operands to binary expressions('complex' and ''complex')
0
zer0mail
2445 / 2079 / 205
Регистрация: 03.07.2012
Сообщений: 7,557
Записей в блоге: 1
22.09.2013, 01:00 #6
Замечение:
C++
1
2
3
4
Вместо
complex  operator+=(complex& t)
надо писать
complex& operator+=(complex& t)
Аналогично для других операторов с '='
1
Banddk
38 / 38 / 2
Регистрация: 08.12.2012
Сообщений: 157
Записей в блоге: 1
22.09.2013, 01:19  [ТС] #7
Спасибо) Но к сожалению мою проблему это не исправляет
0
zer0mail
2445 / 2079 / 205
Регистрация: 03.07.2012
Сообщений: 7,557
Записей в блоге: 1
22.09.2013, 01:43 #8
Так откуда ж нам знать, где она, твоя проблема? Телепаты и экстрасенсы в отпуске .
1
alsav22
5435 / 4830 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
22.09.2013, 02:17 #9
Цитата Сообщение от Banddk Посмотреть сообщение
Но к сожалению мою проблему это не исправляет
Ваша проблема в том, что умножение возвращает копию, а сложению нужна ссылка.
1
zer0mail
2445 / 2079 / 205
Регистрация: 03.07.2012
Сообщений: 7,557
Записей в блоге: 1
22.09.2013, 02:26 #10
Цитата Сообщение от alsav22 Посмотреть сообщение
Ваша проблема в том, что умножение возвращает копию, а сложению нужна ссылка.
Не думаю, что проблема в этом, с таким main работает:
C++
1
2
3
4
5
6
7
int main()
{
    complex b=complex(1.0,.0);
    complex c=complex(2.0,.0);
    complex d=complex(3.0,.0);
    complex a=b+c*d;
}
ТС не показывает весь код, а гадать нет желания.
1
alsav22
5435 / 4830 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
22.09.2013, 03:24 #11
Цитата Сообщение от zer0mail Посмотреть сообщение
с таким main работает:
В студии? У меня тоже, а mingw компилировать уже не хочет.
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
D:\Code B\ааааа\main.cpp||In function 'int main()':|
D:\Code B\ааааа\main.cpp|86|error: no match for 'operator+' in 'b + c.complex::operator*((* & d))'|
D:\Code B\ааааа\main.cpp|86|note: candidates are:|
D:\Code B\ааааа\main.cpp|17|note: complex complex::operator+(complex&)|
D:\Code B\ааааа\main.cpp|17|note:   no known conversion for argument 1 from 'complex' to 'complex&'|
d:\mingw_cb12\bin\..\lib\gcc\mingw32\4.7.1\include\c++\bits\stl_iterator.h|335|note: template<class _Iterator> std::reverse_iterator<_Iterator> std::operator+(typename std::reverse_iterator<_Iterator>::difference_type, const std::reverse_iterator<_Iterator>&)|
d:\mingw_cb12\bin\..\lib\gcc\mingw32\4.7.1\include\c++\bits\stl_iterator.h|335|note:   template argument deduction/substitution failed:|
D:\Code B\ааааа\main.cpp|86|note:   'complex' is not derived from 'const std::reverse_iterator<_Iterator>'|
d:\mingw_cb12\bin\..\lib\gcc\mingw32\4.7.1\include\c++\bits\basic_string.h|2362|note: template<class _CharT, class _Traits, class _Alloc> std::basic_string<_CharT, _Traits, _Alloc> std::operator+(const std::basic_string<_CharT, _Traits, _Alloc>&, const std::basic_string<_CharT, _Traits, _Alloc>&)|
d:\mingw_cb12\bin\..\lib\gcc\mingw32\4.7.1\include\c++\bits\basic_string.h|2362|note:   template argument deduction/substitution failed:|
D:\Code B\ааааа\main.cpp|86|note:   'complex' is not derived from 'const std::basic_string<_CharT, _Traits, _Alloc>'|
d:\mingw_cb12\bin\..\lib\gcc\mingw32\4.7.1\include\c++\bits\basic_string.tcc|694|note: template<class _CharT, class _Traits, class _Alloc> std::basic_string<_CharT, _Traits, _Alloc> std::operator+(const _CharT*, const std::basic_string<_CharT, _Traits, _Alloc>&)|
d:\mingw_cb12\bin\..\lib\gcc\mingw32\4.7.1\include\c++\bits\basic_string.tcc|694|note:   template argument deduction/substitution failed:|
D:\Code B\ааааа\main.cpp|86|note:   mismatched types 'const _CharT*' and 'complex'|
d:\mingw_cb12\bin\..\lib\gcc\mingw32\4.7.1\include\c++\bits\basic_string.tcc|710|note: template<class _CharT, class _Traits, class _Alloc> std::basic_string<_CharT, _Traits, _Alloc> std::operator+(_CharT, const std::basic_string<_CharT, _Traits, _Alloc>&)|
d:\mingw_cb12\bin\..\lib\gcc\mingw32\4.7.1\include\c++\bits\basic_string.tcc|710|note:   template argument deduction/substitution failed:|
D:\Code B\ааааа\main.cpp|86|note:   'complex' is not derived from 'const std::basic_string<_CharT, _Traits, _Alloc>'|
d:\mingw_cb12\bin\..\lib\gcc\mingw32\4.7.1\include\c++\bits\basic_string.h|2399|note: template<class _CharT, class _Traits, class _Alloc> std::basic_string<_CharT, _Traits, _Alloc> std::operator+(const std::basic_string<_CharT, _Traits, _Alloc>&, const _CharT*)|
d:\mingw_cb12\bin\..\lib\gcc\mingw32\4.7.1\include\c++\bits\basic_string.h|2399|note:   template argument deduction/substitution failed:|
D:\Code B\ааааа\main.cpp|86|note:   'complex' is not derived from 'const std::basic_string<_CharT, _Traits, _Alloc>'|
d:\mingw_cb12\bin\..\lib\gcc\mingw32\4.7.1\include\c++\bits\basic_string.h|2415|note: template<class _CharT, class _Traits, class _Alloc> std::basic_string<_CharT, _Traits, _Alloc> std::operator+(const std::basic_string<_CharT, _Traits, _Alloc>&, _CharT)|
d:\mingw_cb12\bin\..\lib\gcc\mingw32\4.7.1\include\c++\bits\basic_string.h|2415|note:   template argument deduction/substitution failed:|
D:\Code B\ааааа\main.cpp|86|note:   'complex' is not derived from 'const std::basic_string<_CharT, _Traits, _Alloc>'|
D:\Code B\ааааа\main.cpp|86|warning: unused variable 'a' [-Wunused-variable]|
||=== Build finished: 1 errors, 1 warnings (0 minutes, 1 seconds) ===|
Добавлено через 4 минуты
Вот так меняю и всё компилируется:
C++
1
2
complex operator+(complex t){
return complex(x+t.x,y+t.y);
1
zer0mail
2445 / 2079 / 205
Регистрация: 03.07.2012
Сообщений: 7,557
Записей в блоге: 1
22.09.2013, 09:43 #12
Имхо, лучше так:
C++
1
2
3
complex operator+(const complex& t){
return complex(x+t.x,y+t.y)
}
И убрать пару ';', где они после '}' в описании класса
1
Tulosba
:)
Эксперт С++
4705 / 3240 / 297
Регистрация: 19.02.2013
Сообщений: 9,046
22.09.2013, 10:13 #13
Для double операнда не обойтись без friend версии. Или, по крайней мере, внешнего для класса оператора.
1
Banddk
38 / 38 / 2
Регистрация: 08.12.2012
Сообщений: 157
Записей в блоге: 1
22.09.2013, 11:30  [ТС] #14
Цитата Сообщение от alsav22 Посмотреть сообщение
Вот так меняю и всё компилируется:
Код C++
1
2
3
complex operator+(complex t){
return complex(x+t.x,y+t.y);
Да вот так стало работать

Добавлено через 8 минут
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include <iostream>
#include "cmath"
using namespace std;
class complex{
    public:
    double x,y;
    complex(){
        x=0;
        y=0;
    };
    complex(double a,double b){
        x=a;
        y=b;
    }
    complex operator+(const complex& t)const{
        return complex(x+t.x,y+t.y);
    }
    complex operator-(const complex& t)const {
        return complex(x-t.x,y-t.y);
    }
    complex operator*(const complex t)const{
        return complex(x*t.x-y*t.y,x*t.y+y*t.x);
    }
    complex operator*(double t) const{
        return complex(x*t,y*t);
    }
    complex & operator=(const complex& t){
    x=t.x;
    y=t.y;
    return *this;
    }
    complex& operator+=(const complex& t){
        x += t.x;
        y += t.y;
        return *this;
    }
    complex& operator-=(const complex& t){
        x -= t.x;
        y -= t.y;
        return *this;
    }
 
    complex operator/(const complex& t)const{
        return complex((x*t.x+y*t.y)/(t.x*t.x+t.y*t.y),(y*t.x-x*t.y)/(t.x*t.x+t.y*t.y));
        
    }
    double module(){
        return(sqrt(x*x+y*y));
    }
    double arg(){
        return atan2(y,x);
    }
    friend complex sqrt(complex t){
        return(complex(sqrt(t.module())*cos(t.arg()/2),sqrt(t.module())*sin(t.arg()/2)));
    };
 
    
    
};
 
ostream &operator<<(ostream &out, complex t)
{
    out<<t.x;
    if(t.y!=0)
        out<<"+i*("<<t.y<<")";
    
    return out;
}
 
istream &operator>>(istream &in, complex &t)
{
    cout<<"RealPart\n>";
    in >> t.x;
    cout<<"ImagePart\n>";
    in>>t.y;
    return in;
}
Вот исправил так )все вроде нормально работает )Всем Спасибо)
0
alsav22
5435 / 4830 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
22.09.2013, 13:15 #15
Да, const решает проблему...
0
22.09.2013, 13:15
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.09.2013, 13:15
Привет! Вот еще темы с ответами:

Перегрузка операторов - C++
Задание такое-Составить описание класса для представления комплексных чисел. Обеспечить выполнение операций сложения, вычитания и умножения...

Перегрузка операторов - C++
Вообщем в чём дело смысл перегрузки операторов ясен,зачем применять тоже ясно,как организуется понятно,перегрузка унарных операторов...

Перегрузка операторов + и = - C++
Здравствуйте! У меня такой вопрос. Пишу класс подобный string. Перегрузила оператор + Line &amp;Line::operator+ (const Line&amp; right)const...

Перегрузка операторов - C++
Решите пожалуйсто задачу: Разработайте программу, в которой реализована перегрузка оператора «^». Оператор «^» должен возводить...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru