Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[34.204.181.19] |
|
Сообщ.
#1
,
|
|
|
Доброго времени суток!
Плюсы "знаю" поверхностно и что-то кодить пытаюсь не столь часто. #include <stdio.h> //У class op1 { protected: int a; double d; bool b; public: op1(int _a=0, double _d=0, bool _b=0) : a(_a), d(_d), b(_b) {} op1 operator+(op1 &ob) { a = a + ob.a; d = d + ob.d; b = (b || ob.b); return *this; } op1 operator-(op1 &ob) { a = a - ob.a; d = d - ob.d; if (b && !ob.b) { b = true; return *this;} if (b && ob.b) { b = false; return *this;} if (!b && !ob.b) { b = true; return *this;} if (!b && ob.b) { b = false; return *this;} return *this; } void print () { printf ("Vot %d, %f, %d\n", a, d, b);} op1 operator-() { a = -a; d = -d; if (b) { b = false; return *this;} if (!b) { b = true; return *this;} return *this; } bool operator!= (op1 &ob) { return ( (a!=ob.a)||(d!=ob.d)||(b!=ob.b) ); } op1 operator= (op1 &ob) { if (this != &ob) { a=ob.a; d=ob.d; b=ob.b; } return *this; } op1 vstavF( int _a, double _d, bool _b) { a=_a; d=_d; b=_b; return *this; } }; int main () { op1 od (25, 555, true); od.print(); op1 dwa ( 47.58, false); dwa.print(); dwa = od - dwa; dwa.print(); dwa = -dwa; dwa.print(); op1 tri; tri = dwa; bool nu=true; nu = (tri!=dwa); printf ("Vot %d\n",nu); tri.vstavF( 44, 98.5, true); dwa.print(); tri.print(); return 0; } собственно ошибки ||=== Build: Debug in operator (compiler: GNU GCC Compiler) ===| G:\void_main\operator\operator.cpp||In function 'int main()':| G:\void_main\operator\operator.cpp|75|error: no match for 'operator=' (operand types are 'op1' and 'op1')| G:\void_main\operator\operator.cpp|75|note: candidate is:| G:\void_main\operator\operator.cpp|49|note: op1 op1::operator=(op1&)| G:\void_main\operator\operator.cpp|49|note: no known conversion for argument 1 from 'op1' to 'op1&'| G:\void_main\operator\operator.cpp|77|error: no match for 'operator=' (operand types are 'op1' and 'op1')| G:\void_main\operator\operator.cpp|77|note: candidate is:| G:\void_main\operator\operator.cpp|49|note: op1 op1::operator=(op1&)| G:\void_main\operator\operator.cpp|49|note: no known conversion for argument 1 from 'op1' to 'op1&'| ||=== Build failed: 2 error(s), 0 warning(s) (0 minute(s), 13 second(s)) ===| Когда нужен и не нужен 'operator='? Что именно ему не хватает? Как быть? Что выдает return *this? Объект но я не могу этого представить, this это указатель и да, он содержит адрес объекта эта цифра и ее просто выдать, но объект содержит в себе возможно множество полей и цифр, и как его выдать? а если разименовали звездочкой, то уже не указатель а объект мы имеем! Какой и когда бывает 'operator='? Какие еще бывают 'operator'? Что почитать во всех подробностях? |
Сообщ.
#2
,
|
|
|
Цитата Necoder @ Как быть? Вот так в своем классе переопредели оператор = op1 operator= (const op1 &ob) Цитата Necoder @ Что именно ему не хватает? const ему не хватает, описание ошибок конечно туповатое. Добавлено И конструктор копирования напиши. Добавлено Ссылка по теме: https://habrahabr.ru/post/308890/ Добавлено И вообще запомни, или татуху лучше набей: когда в какую либо функцию передаешь объект по ссылке, если внутри этой функции ты его не изменяешь, то всегда пиши const: SomeType SomeFunction(const SomeObject& obj) Добавлено На всякий случай: https://ideone.com/lWeTxz |
Сообщ.
#3
,
|
|
|
Цитата KILLER @ Строго говоря, оператор = должен возвращать неконстантную ссылку. То есть такая бредовая конструкция const ему не хватает, описание ошибок конечно туповатое. (a = 2) = 3; Более того, при использовании операторов _= (операция с переменной), её иногда можно даже употребить с пользой. (a = 2) += 1; |
Сообщ.
#4
,
|
|
|
Цитата amk @ Строго говоря, оператор = должен возвращать неконстантную ссылку. Ну да, плюс еще ссылку нужно дописать. |
Сообщ.
#5
,
|
|
|
Спасибо!!!!!!
Ссылка отличная! |