0

我想从我的 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;
            ...
        }
};

我应该使用“这个”吗?我不明白为什么接收器看不到引擎。

4

3 回答 3

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();
    }
}
于 2012-07-29T22:21:51.693 回答
0

eventReceiver 不应该对引擎有任何了解。这是一个糟糕的设计。有几个解决方案。一种合理的解决方案是gameeventReceiver因为game可以清楚地接收事件。然后,您可以自行实现特定OnEvent于游戏的处理程序game。从那里你可以打电话engine->quit

于 2012-07-29T22:08:45.987 回答
0

我不知道这个设计有多优雅,但它确实有效。

我只是将接收器从游戏类中分离出来,并给它的构造函数一个指向 myGame 实例的指针。(感谢帕拉奈克斯)

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);
}
于 2012-07-29T23:20:08.000 回答