В моем игровом движке у меня есть класс State, который представляет игровой мир в определенный момент времени. Это состояние содержит несколько объектов Body, каждый из которых определяет одно твердое тело. Каждое состояние имеет контейнер для отслеживания принадлежащих ему объектов Body, а каждое тело имеет указатель на свое родительское состояние.
План государственного класса:
class State {
private:
std::set<Body*> _bodies;
public:
//It could be done here
void addBody(Body* body) {
//Remove from old State
if (body->_state)
body->_state->_bodies.erase(this);
//Set Body's back-reference
body->_state = this;
//Add to this State
_bodies.insert(body);
}
};
Схема класса тела:
class Body {
private:
State* _state;
public:
//It could also be done here
void setState(State* state) {
//Remove from old State
if (_state)
_state->_bodies.erase(this);
//Set back-reference
_state = state;
//Add to the new State
if (_state)
_state->bodies.insert(this);
}
};
Проблема, если таковая имеется, заключается в том, что добавление / удаление тела в / из государства требует смены частного члена каждого.
В какой-то момент я подумал о том, чтобы иметь статический класс State-Body-mediator, который бы имел доступ друзей к обоим классам. Звучит неплохо, потому что отношениями между государством и телом будет явно управлять это имя, но для управления простыми отношениями требуется много объявлений.
Есть ли "лучший" способ сделать это? Я хотел бы посмотреть, какие бывают идеи.