Ответ 1
Как указывали другие плакаты, назначение далека от
тривиально, и operator+
обычно не является членом. Есть два
вопросы, которые необходимо решить:
- Если вы поддерживаете `FigAbs + Coord`, то вы также должны поддерживать `Coord + FigAbs`. Первым может быть член (нет реальных проблема там); второй, если он должен быть членом, должен быть член "Координаты", который, вероятно, не является тем, что требуется.
- Любая разумная реализация `operator +` должна возвращаться
стоимость. И вы не можете (обычно) возвращать полиморфный класс
стоимость; вам нужно что-то вроде идиомы письма-конверта для
это для работы: базовый класс должен выглядеть примерно так:
class Figure : BinaryOperators<Figure, Coord> { Figure* myImpl; public: Figure& operator+=( Coord const& translation ) { myImpl->operator+=( translation ); return *this; } };
Конечно, вам понадобятся методы factory создание экземпляра `Figure` для каждого другого типа, виртуального `clone`, и конструктор копирования, назначение и деструктор, который поддерживает глубокую копию. (`BinaryOperators` является класс шаблона, который реализует `operator +` в терминах `Оператор + =`; это обычный способ предоставления двоичного кода операторы.)
Наконец, я бы сказал, что это оператор, перегружающий злоупотребления. Понятие добавления не относится к геометрическим фигурам. То, что вы делаете, называется переводом, а логическое решение заключается в предоставлении функции-члена, которая делает это, а не добавление перегрузки.