Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
38 / 38 / 13
Регистрация: 08.12.2012
Сообщений: 157
Записей в блоге: 1

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

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

Студворк — интернет-сервис помощи студентам
Пишу класс комплексных чисел. И возникла проблема.Я перегрузил операторы +-*/. Но когда использую их в строке типа a=b+c*d - где все переменные комплексные возникает проблема.Но когда я пишу a=c*d; a=a+b; так все работает. Подскажите как это исправить пожалуйста
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.09.2013, 21:49
Ответы с готовыми решениями:

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

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

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

14
 Аватар для egor2116
584 / 387 / 216
Регистрация: 20.01.2013
Сообщений: 1,169
21.09.2013, 22:19
Покажите перегруженные операторы
0
38 / 38 / 13
Регистрация: 08.12.2012
Сообщений: 157
Записей в блоге: 1
21.09.2013, 22:27  [ТС]
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
584 / 387 / 216
Регистрация: 20.01.2013
Сообщений: 1,169
21.09.2013, 23:01
Надо еще раз перегружать оператор?
да
в строке типа a=b+c*d - где все переменные комплексные возникает проблема
а в чем именно проблема ?
1
38 / 38 / 13
Регистрация: 08.12.2012
Сообщений: 157
Записей в блоге: 1
22.09.2013, 00:34  [ТС]
не компилируется ( Пишет "invalid operands to binary expressions('complex' and ''complex')
0
2688 / 2260 / 244
Регистрация: 03.07.2012
Сообщений: 8,231
Записей в блоге: 1
22.09.2013, 01:00
Замечение:
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  [ТС]
Спасибо) Но к сожалению мою проблему это не исправляет
0
2688 / 2260 / 244
Регистрация: 03.07.2012
Сообщений: 8,231
Записей в блоге: 1
22.09.2013, 01:43
Так откуда ж нам знать, где она, твоя проблема? Телепаты и экстрасенсы в отпуске .
1
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
22.09.2013, 02:17
Цитата Сообщение от Banddk Посмотреть сообщение
Но к сожалению мою проблему это не исправляет
Ваша проблема в том, что умножение возвращает копию, а сложению нужна ссылка.
1
2688 / 2260 / 244
Регистрация: 03.07.2012
Сообщений: 8,231
Записей в блоге: 1
22.09.2013, 02:26
Цитата Сообщение от 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
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
22.09.2013, 03:24
Цитата Сообщение от 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
2688 / 2260 / 244
Регистрация: 03.07.2012
Сообщений: 8,231
Записей в блоге: 1
22.09.2013, 09:43
Имхо, лучше так:
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
Для double операнда не обойтись без friend версии. Или, по крайней мере, внешнего для класса оператора.
1
38 / 38 / 13
Регистрация: 08.12.2012
Сообщений: 157
Записей в блоге: 1
22.09.2013, 11:30  [ТС]
Цитата Сообщение от 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
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
22.09.2013, 13:15
Да, const решает проблему...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.09.2013, 13:15
Помогаю со студенческими работами здесь

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

Перегрузка операторов
я учусь перегружать операторы,но не получается,выдает exception class Student { public: Student(void) { name=new char; ...

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

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

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


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия SDL 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual. . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru