我想从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"吗?我不明白为什么接收器看不到发动机。
将类实现为Singleton,并为engine
属性编写getter。访问代码可能看起来像:
game::getInstance()->getEngine()->quit();
不过,我建议您在游戏类本身中创建一个quite()
方法,隐藏实现细节,并允许您处理整个应用程序的关闭,而不仅仅是3dEngine
:
game::getInstance()->quit();
如果您不想将game
类实现为singleton,您还可以将game
对象的引用/指针传递给事件处理程序的构造函数:
class CloseButtonHandler : public eventHandler {
game& game;
public:
CloseButtonHandler(game& game) : game(game) {
}
virtual bool OnEvent(const SEvent& event){
...
game.getEngine()->quit();
}
}
eventReceiver不应该知道任何关于引擎的信息。这是个糟糕的设计。有几个解决方案。一个合理的解决方案是从eventReceiver
导出game
,因为game
可以清楚地接收事件。然后,您可以在game
本身中实现特定于游戏的OnEvent
处理程序。从那里您可以拨打engine->quit
。
我不知道这个设计有多优雅,但它很管用。
我只是将接收器从game类中分离出来,并给它的构造函数一个指向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);
}