6502 ответ правильный, а код аккуратный.
Я просто хотел дать исправление, минимизирующее изменения вашего исходного кода, для ясности:
translation2d translation2d::translateBy(translation2d other)
{
translation2d copy = *this;
copy.x += other.x;
copy.y += other.y;
return copy;
}
Идея состоит в том, to:
- Создайте копию «текущего» объекта, чтобы вы не влияли на оригинал (вам это не нужно)
- Возвращайте эту копию после настройки это с данными из
other
Если вы пишете по-другому, мы можем избежать копирования аргумента снова , поскольку вы уже передали его по значению:
translation2d translation2d::translateBy(translation2d copy)
{
copy.x += this->x;
copy.y += this->y;
return copy;
}
… Хотя я ожидаю, что компилятор сделает это за вас в реальности, и мне труднее читать эту версию кода. В последнем разделе этого ответа вы найдете другие способы избежать лишней копии (при условии, что вы склонны беспокоиться об этом).
Альтернативная версия этой функции фактически переведет значение объект, а не возвращение нового:
translation2d& translation2d::translateBy(translation2d other)
{
this->x += other.x;
this->y += other.y;
return *this;
}
Обратите внимание, что я все еще что-то возвращаю, а не void
; в этом случае я следовал соглашению о возврате ссылки на текущий объект, что помогает объединить несколько модификаций в один и тот же объект. Вы часто найдете этот шаблон в перегрузке операторов.
Технически this->
не требуется, но это немного облегчает понимание функции.
Обратите внимание, что 6502 изменилось функция для получения other
по const-reference, что часто является хорошей идеей, и вам следует подумать об этом тоже (хотя копирование двух double
s настолько дешево, что может не стоить косвенного обращения).