我想从eventReceiver对象中访问引擎。他们是游戏类的成员,但我如何达到它?
// game.h
class game
{
public:
game();
3dEngine* engine;
eventReceiver* receiver;
};
// eventReceiver.h
class eventReceiver
{
public:
eventReceiver () {}
virtual bool OnEvent (const SEvent& event)
{
...
case QUIT_BUTTON_PRESSED:
>>> engine->quit(); // how to access engine from here??
return true;
...
}
};
我应该使用'this'吗?我不明白为什么接收器看不到发动机。
答案 0 :(得分:1)
将该类实现为Singleton并为engine
属性编写一个getter。访问代码可能如下所示:
game::getInstance()->getEngine()->quit();
我建议你,你在游戏类中创建一个quite()
方法隐藏了实现细节,并允许你处理整个应用程序关闭,而不仅仅是3dEngine
:
game::getInstance()->quit();
如果您不想将game
类实现为单例,您还可以将game
对象的引用/指针传递给事件处理程序的构造函数:
class CloseButtonHandler : public eventHandler {
game& game;
public:
CloseButtonHandler(game& game) : game(game) {
}
virtual bool OnEvent(const SEvent& event){
...
game.getEngine()->quit();
}
}
答案 1 :(得分:0)
eventReceiver不应该对引擎有任何了解。这是一个糟糕的设计。有一些解决方案。一个合理的解决方案是从game
派生eventReceiver
,因为game
可以清楚地接收事件。然后,您可以在OnEvent
本身中实现特定于游戏的game
处理程序。从那里你可以拨打engine->quit
。
答案 2 :(得分:0)
我不知道这个设计有多优雅,但它确实有用。
我刚刚将接收器与游戏类分开,并为其构造函数指定了myGame实例的指针。 (感谢Paranaix)
class eventReceiver {
public:
eventReceiver (game* gameInstance) : gamei(gameInstance)
virtual bool OnEvent (...)
{...
case QUIT_BUTTON_PRESSED:
gamei.engine->quitGame();
...}
private:
game* gamei;
}
int main() {
game myGame;
eventReceiver receiver (&myGame);
}