Страницы

Поиск по вопросам

понедельник, 10 декабря 2018 г.

Перегрузка оператора сложения

class Cat { private: int value = 1;
public: Cat(int _value) { value = _value; }
operator+(Cat a, Cat b) { return new Cat(a.value + b.value); } };
Казалось бы все пишу правильно, сложение двух котов даст нового кота, у которого value будет суммой их value'ов. Но получаю две ошибки.
main.cpp:17:5: error: C++ requires a type specifier for all declarations operator+(Cat a, Cat b) { ^ main.cpp:18:16: error: cannot initialize return object of type 'int' with an rvalue of type 'Cat *' return new Cat(a.value + b.value); ^~~~~~~~~~~~~~~~~~~~~~~~~~ 2 errors generated.


Ответ

А кто будет объявлять тип возвращаемого значения?
Cat* operator+(Cat a, Cat b) { return new Cat(a.value + b.value); }
Только это - во-первых, не решение, а во-вторых, плохое решение.
Не решение - потому что вообще оператор + бинарный. Он складывает два значения, а у вас в сложении участвуют три - еще и ваш объект (this).
Cat* operator+(Cat b) { return new Cat(this->value + b.value); }
Теперь это решение. Но плохое. Потому что возвращает не кота, а указатель на него. В результате на вызывающую функцию перекладывается ответственность за обязательное сохранение значения и освобождение в дальнейшем памяти.
Этого можно избежать, если возвращать готового кота:
Cat operator+(Cat b) { return Cat(this->value + b.value); }
И последнее. Если кот большой (не в смысле значения value, а занимает много памяти) - то имеет смысл передавать его в оператор не по значению, а по ссылке:
Cat operator+(const Cat& b) { return Cat(this->value + b.value); }

Комментариев нет:

Отправить комментарий