Представьте, что у меня есть класс, используемый для представления некоторых тривиальных числовых данных, таких как вектор. Я хочу, чтобы этот класс был неизменным с точки зрения его членов, но при этом поддерживал правильное поведение при копировании.
Вот как может выглядеть оболочка этого класса:
class Vector {
public:
Vector(float _x, float _y);
private:
const float x;
const float y;
};
Я хотел бы иметь возможность назначить новое значение члену вектора внутри (например) класса. Экранная сущность с позицией, возможно, представленной с использованием неконстантного члена типа Vector
.
Эта «сущность» сама должна быть изменчивой (возможно, поддерживающей движение), например, внутренний элемент Vector
, используемый для хранения его позиции, должен измениться. Вместо непосредственного изменения этого члена я бы заменил его на совершенно новый экземпляр Vector
, инициализированный с измененными значениями.
На таком языке, как C #, я просто вычислял бы новые значения для X и Y на основе текущего экземпляра Vector
и назначал бы новый объект Vector, инициализированный с этими значениями, члену, отбрасывая предыдущее значение и позволяя GC сделает все остальное.
// Inside some class (C#/Java type)...
Vector position;
...
// Example function:
void Move(float _dX, float _dY) {
this.position = new Vector(_dX + position.X, _dY + position.Y);
}
Именно здесь вступают в игру мои ограниченные возможности в C ++, потому что я не уверен, как реализовать operator=
таким образом, чтобы экземпляры этого неизменяемого типа, содержащиеся в динамической памяти, не просто «исчезали» и вызывали утечку .
Итак, я полагаю, вот что я спрашиваю:
Vector& operator=(const Vector& _rhs);
...
// In implementation file...
Vector& Vector::operator=(const Vector& _rhs) {
// WHAT ON EARTH GOES IN HERE?!?!?
}
Случай Vector
- это то, что я придумал, чтобы донести свою мысль, я могу придумать множество типов, которые должны быть неизменными на уровне участника.
Я трачу свое время, пытаясь смоделировать неизменяемые типы?
Есть ли лучшее решение?