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

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

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

перегрузка операторов C++
C++ перегрузка операторов
C++ Перегрузка операторов
Перегрузка операторов C++
C++ Перегрузка операторов
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
egor2116
 Аватар для egor2116
337 / 368 / 42
Регистрация: 20.01.2013
Сообщений: 1,100
21.09.2013, 22:19     Перегрузка операторов 2 #2
Покажите перегруженные операторы
Banddk
37 / 37 / 1
Регистрация: 08.12.2012
Сообщений: 157
Записей в блоге: 1
21.09.2013, 22:27  [ТС]     Перегрузка операторов 2 #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. Надо еще раз перегружать оператор?
egor2116
 Аватар для egor2116
337 / 368 / 42
Регистрация: 20.01.2013
Сообщений: 1,100
21.09.2013, 23:01     Перегрузка операторов 2 #4
Надо еще раз перегружать оператор?
да
в строке типа a=b+c*d - где все переменные комплексные возникает проблема
а в чем именно проблема ?
Banddk
37 / 37 / 1
Регистрация: 08.12.2012
Сообщений: 157
Записей в блоге: 1
22.09.2013, 00:34  [ТС]     Перегрузка операторов 2 #5
не компилируется ( Пишет "invalid operands to binary expressions('complex' and ''complex')
zer0mail
2187 / 1870 / 187
Регистрация: 03.07.2012
Сообщений: 6,653
Записей в блоге: 1
22.09.2013, 01:00     Перегрузка операторов 2 #6
Замечение:
C++
1
2
3
4
Вместо
complex  operator+=(complex& t)
надо писать
complex& operator+=(complex& t)
Аналогично для других операторов с '='
Banddk
37 / 37 / 1
Регистрация: 08.12.2012
Сообщений: 157
Записей в блоге: 1
22.09.2013, 01:19  [ТС]     Перегрузка операторов 2 #7
Спасибо) Но к сожалению мою проблему это не исправляет
zer0mail
2187 / 1870 / 187
Регистрация: 03.07.2012
Сообщений: 6,653
Записей в блоге: 1
22.09.2013, 01:43     Перегрузка операторов 2 #8
Так откуда ж нам знать, где она, твоя проблема? Телепаты и экстрасенсы в отпуске .
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
22.09.2013, 02:17     Перегрузка операторов 2 #9
Цитата Сообщение от Banddk Посмотреть сообщение
Но к сожалению мою проблему это не исправляет
Ваша проблема в том, что умножение возвращает копию, а сложению нужна ссылка.
zer0mail
2187 / 1870 / 187
Регистрация: 03.07.2012
Сообщений: 6,653
Записей в блоге: 1
22.09.2013, 02:26     Перегрузка операторов 2 #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;
}
ТС не показывает весь код, а гадать нет желания.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
22.09.2013, 03:24     Перегрузка операторов 2 #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);
zer0mail
2187 / 1870 / 187
Регистрация: 03.07.2012
Сообщений: 6,653
Записей в блоге: 1
22.09.2013, 09:43     Перегрузка операторов 2 #12
Имхо, лучше так:
C++
1
2
3
complex operator+(const complex& t){
return complex(x+t.x,y+t.y)
}
И убрать пару ';', где они после '}' в описании класса
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
22.09.2013, 10:13     Перегрузка операторов 2 #13
Для double операнда не обойтись без friend версии. Или, по крайней мере, внешнего для класса оператора.
Banddk
37 / 37 / 1
Регистрация: 08.12.2012
Сообщений: 157
Записей в блоге: 1
22.09.2013, 11:30  [ТС]     Перегрузка операторов 2 #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;
}
Вот исправил так )все вроде нормально работает )Всем Спасибо)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.09.2013, 13:15     Перегрузка операторов 2
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
22.09.2013, 13:15     Перегрузка операторов 2 #15
Да, const решает проблему...
Yandex
Объявления
22.09.2013, 13:15     Перегрузка операторов 2
Ответ Создать тему
Опции темы

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