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);
}
Комментариев нет:
Отправить комментарий