Насколько я понимаю обсуждение вопроса, на самом деле проблема не в самих операторах, а в том, что количество разрешенных функций-членов ограничено - и вы уже превысили этот предел.
Однако выиметь целый ряд функций, которые не обязательно должны быть членами, например:
class Point
{
public:
Point operator+(const Point& other) const
{
return Point(x + other.x, y + other.y);
}
};
Сделать из них все функции свободными:
class Point { /*...*/ };
Point operator+(Point const& l, Point const& r)
{
return Point(l.getX() + r.getX(), l.getY() + r.getY());
}
Переместив все эти операторы, какпоказанный выше, вы отойдете достаточно далеко от лимита, чтобы вы могли ввести необходимые методы получения:
class Point
{
public:
double getX() { return x; };
double getY() { return y; };
};
Если вы хотите переименовать переменные-члены, например, добавив префикс, вы можете выполнитьдругой шаблон:
class Point
{
double m_x, m_y;
public:
double x() { return m_x; };
double y() { return m_y; };
void x(double v) { m_x = v; }; // the corresponding setter
// (for illustration, you might not need it)
};
Этот последний шаблон также довольно распространен.Преимущество в том, что оно пропускает явный префикс get
или set
, а недостаток в том, что он точно теряет эту явность ... Решите, какой из них вы предпочитаете.Однако важнее, чем личные предпочтения, является последовательность, поэтому, если, например, существует соглашение или общепринятая практика компании, следуйте этому ...
Некоторые из ваших операторов должны будут оставаться участниками, хотя это все те, кто изменить текущий объект:
class Point
{
public:
Point& operator+=(const Point& other) /* const */ // NEEDS to be non-const
{
x += other.x;
y += other.y;
return *this; // <- very good hint to spot the ones needing to stay members
}
};
Если у вас есть открытый конструктор copy , вы можете повторно использовать operator+=
для определения operator+
:
class Point
{
public:
Point(Point const& other) : Point(other.x, other.y) { }
};
Point operator+(Point const& x, Point const& y)
{
Point r(x); // or Point(x.x(), x.y()), if you lack such constructor)
r += y;
return r;
}
На самом деле, вы даже можете сэкономить явную копию, приняв один из параметров по значению:
Point operator+(Point x, Point const& y)
// ^ no reference
{
return x += y;
}
Последний скорее для иллюстрации, я бы предпочел две ссылки вданный случай для сохранения симметрии интерфейса ...