如何从方法访问类成员?

时间:2012-07-29 21:52:55

标签: c++ class scope

我想从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'吗?我不明白为什么接收器看不到发动机。

3 个答案:

答案 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);
}