Если я правильно понимаю, вы хотите, чтобы m_NewPosition
всегда было равно m_Position
плюс некоторое смещение в пространстве, даже когда оно модифицируется (что-то вроде реактивного программирования ).Это не достижимо, как вы пытались это сделать, вы, вероятно, должны найти хорошую ссылку на указатели.Тем не менее, в вашем распоряжении есть несколько решений.
Первое - использовать функцию / метод, , как @Benjamin Lindley предложил : поскольку NewPosition
является вычисленным значением, оно делаетсмысл вычислять его в функции:
class Character
{
public:
Vector3 getPosition() const
{
return m_Position;
}
Vector3 getNewPosition() const
{
return getPosition() + Vector3(0, 0, 10);
}
private:
Vector3 m_Position;
};
Это весь смысл инкапсуляции, означающий скрытие внутренних частей вашего объекта: «видимые» свойства вашего объекта должны быть доступны только через функции-члены (методы), позволяя вам изменить способ их хранения или вычислить их «на лету», например m_NewPosition
в вашем примере.
Другое решение, более сложное (и, вероятно, не подходящее в вашем случае),это написать новый класс, который представляет относительную позицию:
class RelativePosition
{
public:
RelativePosition(Vector3 const & origin, Vector3 const & offset)
: m_Origin(origin), m_Offset(offset)
{}
Vector3 getAbsolutePosition() const
{
return m_Origin + m_Offset;
}
private:
Vector3 const & m_Origin;
Vector3 m_offset;
};
Обратите внимание, как RelativePosition
хранит ссылку на его происхождение, а не копию;благодаря этому, если источник изменен (т. е. перемещен), относительная позиция будет отражать это изменение.
Теперь вы можете использовать экземпляр этого класса для представления m_newPosition
, который действительно является относительной позицией(относительно m_Position
, со смещением `Vector3 (0, 0, 10)).Однако, как я уже говорил ранее, я думаю, что это решение, вероятно, излишне для вашего случая;вам, вероятно, следует придерживаться предыдущего подхода.