У меня есть два класса:Объект Middleman для управления доступом?
class World {
public:
void update();
void addObject(GameObject* obj);
std::vector<GameObject const*> getGameObjectsAt(float x,float y,float radius) const;
private:
std::vector<GameObject*> gameObjects
}
class GameObject {
public:
void update();
}
Теперь я хочу GameObject
быть в состоянии назвать getGameObjectsAt
и addObject
из World
в update
функции. Однако я не хочу, чтобы GameObject
мог позвонить функции update
World
.
Я мог бы сделать новый класс WorldSomething
, содержащие мой World
объект и имеет функцию addObject
и getGameObjectsAt
. Тогда я мог бы передать мой WorldSomething
объект функции GameObject
обновления:
class World {
public:
void update();
private:
std::vector<GameObject*> gameObjects
}
class WorldSomething {
public:
void addObject(GameObject* obj);
std::vector<GameObject const*> getGameObjectsAt(float x,float y,float radius) const;
private:
World* world;
}
class GameObject {
public:
void update(const WorldSomething& worldSomething);
}
Однако это перемещает свои операции дальше от моих данных, и я должен передать свой объект WorldSomething к функции обновлени GameObject. Есть ли лучшее решение? (Я использую C++, если это помогает ...) И что бы вы назвали таким классом WorldSomething
?
Сделать «частных» членов «частными»? –
@JoachimPileborg: update() of World должен быть общедоступным, так как он вызывается из другой части моего кода. (мой игровой цикл) – macco
Можете ли вы рассказать о том, почему это проблема, если GameObject может вызвать функцию обновления World? Кроме того, если единственным объектом, которому разрешено вызывать 'update', является игровой цикл, тогда вы можете подумать о дружеских отношениях. В качестве альтернативы, шаблон посетителя, где вызывается обновление, если посетителем является gameloop, и что-то еще в противном случае. – AndyG