如何调用父函数

How to call a parent function?

本文关键字:函数 调用 何调用      更新时间:2023-10-16

我最近开始用c++学习面向对象的概念,并尝试用类制作一个简单的井字游戏。我的Game类的游戏循环从用户那里获得输入,这就是我遇到这个问题的地方。我创建了一个InputHandler类,Game类有它的一个实例,在游戏循环中我调用InputHandler .input()。如果玩家输入"restart",我希望通过调用game.restart()来重启游戏,但是我的InputHandler对象没有游戏的实例。所以我目前的解决方案是通过InputHandler对象的引用来传递游戏,这样我就可以从那里调用game.restart(),然而,从我学到的关于OOP的一切来看,这似乎是糟糕的做法。同样,对于做类似事情的每个函数,我也需要通过引用传递游戏对象。我觉得我错过了一些关于OOP设计的基本知识。通过引用传递游戏对象是否很糟糕,或者是否有更好的方法来解决这个问题?

//game.cpp
void Game::run() {
   while(!gameOver) {
      inputHandler.input(this);
   }
}
//inputHandler.cpp
void InputHandler::input(Game& game) {
   std::string input;
   std::cin >> input;
   if (input == "restart") {
      game.restart();
   }
}

处理特殊操作的一种方法是传递一个处理函数(也称为回调)。c++的方式是std::function<void()>,可以在检测到特定事件时触发:

class SomeClass {
    ...
    std::function<void()> d_restartHandler;
public:
    void setRestartHandler(std::function<void()> handler) { d_restartHandler = handler; }
    void doSomething() {
        ...
        if (timeToRestart && this->d_restartHandler) {
            this->d_restartHandler();
        }
        ...
    }
};

函数模板std::function<Signature>实际上也可以通过合适的参数来参数化,通过使用合适的签名来实例化它。如果您觉得这种方法不是面向对象的:它实际上是面向对象的!在内部,std::function<Signature>包含一个层次结构,其中包含一个基类,一个具体类,其中包含要调度的实际函数对象。你甚至可以自己实现类似的东西,但我认为这将是毫无意义的浪费时间。

假设您有SomeClass实例scGame实例g,您可以使用类似

的内容注册重新启动
sc.setRestartHandler([&](){ g.restart(); });