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

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

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

Пишу класс комплексных чисел. И возникла проблема.Я перегрузил операторы +-*/. Но когда использую их в строке типа a=b+c*d - где все переменные комплексные возникает проблема.Но когда я пишу a=c*d; a=a+b; так все работает. Подскажите как это исправить пожалуйста
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.09.2013, 21:49
Ответы с готовыми решениями:

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

Перегрузка операторов С++
Всем привет!:) Помогите пожалуйста разобраться в коде. Я сооооовсем начинающий и сейчас учу с++ по...

перегрузка операторов
Встала проблема с перегрузкой операторов. Обычные типа --, или += я вроде как написать смог, но...

Перегрузка операторов <<, >>
у меня есть класс, к примеру template &lt;typename type&gt; class ls { private: type val;...

14
584 / 387 / 216
Регистрация: 20.01.2013
Сообщений: 1,169
21.09.2013, 22:19 2
Покажите перегруженные операторы
0
38 / 38 / 13
Регистрация: 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
584 / 387 / 216
Регистрация: 20.01.2013
Сообщений: 1,169
21.09.2013, 23:01 4
Надо еще раз перегружать оператор?
да
в строке типа a=b+c*d - где все переменные комплексные возникает проблема
а в чем именно проблема ?
1
38 / 38 / 13
Регистрация: 08.12.2012
Сообщений: 157
Записей в блоге: 1
22.09.2013, 00:34  [ТС] 5
не компилируется ( Пишет "invalid operands to binary expressions('complex' and ''complex')
0
2644 / 2220 / 239
Регистрация: 03.07.2012
Сообщений: 8,060
Записей в блоге: 1
22.09.2013, 01:00 6
Замечение:
C++
1
2
3
4
Вместо
complex  operator+=(complex& t)
надо писать
complex& operator+=(complex& t)
Аналогично для других операторов с '='
1
38 / 38 / 13
Регистрация: 08.12.2012
Сообщений: 157
Записей в блоге: 1
22.09.2013, 01:19  [ТС] 7
Спасибо) Но к сожалению мою проблему это не исправляет
0
2644 / 2220 / 239
Регистрация: 03.07.2012
Сообщений: 8,060
Записей в блоге: 1
22.09.2013, 01:43 8
Так откуда ж нам знать, где она, твоя проблема? Телепаты и экстрасенсы в отпуске .
1
5489 / 4884 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
22.09.2013, 02:17 9
Цитата Сообщение от Banddk Посмотреть сообщение
Но к сожалению мою проблему это не исправляет
Ваша проблема в том, что умножение возвращает копию, а сложению нужна ссылка.
1
2644 / 2220 / 239
Регистрация: 03.07.2012
Сообщений: 8,060
Записей в блоге: 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
5489 / 4884 / 831
Регистрация: 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
2644 / 2220 / 239
Регистрация: 03.07.2012
Сообщений: 8,060
Записей в блоге: 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
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
22.09.2013, 10:13 13
Для double операнда не обойтись без friend версии. Или, по крайней мере, внешнего для класса оператора.
1
38 / 38 / 13
Регистрация: 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
5489 / 4884 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
22.09.2013, 13:15 15
Да, const решает проблему...
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.09.2013, 13:15
Помогаю со студенческими работами здесь

Перегрузка операторов
я учусь перегружать операторы,но не получается,выдает exception class Student { public:...

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

Перегрузка операторов
В общем задание следующее: Создайте класс chess (шахматы), в котором хранятся поля шахматной доски...

Перегрузка операторов
Ошибка: &quot;error: invalid operands to binary expression ('Number *' and 'Number *') n3 = n1 * n2;&quot;...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru