如何从方法访问类成员



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

最新更新