如何在运行时选择某些方法?

时间:2011-06-14 20:05:32

标签: c++ runtime

为了让我的代码更清晰,我试图将一长段代码分成几个方法(类似于PHP)。

我有一个变量CurrentStep,表示要渲染的当前屏幕。

class Game
{
private:
    enum Step { Welcome = 0, Menu, };
    unsigned int CurrentStep;
}

现在我想在渲染帧时调用相应的方法:

void Game::RenderFrame
{
    switch (CurrentStep)
    {
    case Welcome:
        // the actual work is done by WelcomeScreen() to keep this clean
        WelcomeScreen(); break;
    case Menu:
        // same here
        MenuScreen(); break;
    }
}

我希望我想要实现的目标是可以理解的。最终它应该调用适当的方法(在运行时)。

然而,这种方式只是多余的......是不是有一种“更好”的方式来使用C ++?

5 个答案:

答案 0 :(得分:2)

首先,您的私有变量应声明为Step CurrentStep;RenderFrame()需要括号。接下来,考虑到问题的一般性和模糊性,很难给出具体的建议,但原则上你可以用继承做点什么:

class AbstractGameState
{
    virtual ~AbstractGameState() { }
    virtual void renderFrame() = 0;
};

class WelcomeScreenState : public AbstractGameState
{
  void renderFrame(); // implement!
};

class MenuState : public AbstractGameState
{
  void renderFrame(); // implement!
};

class Game
{
  std::vector<std::shared_ptr<AbstractGameState> > gameStates;
public:
  void renderFrame()
  {
    std::shared_ptr<AbstractGameState> state = getCurrentState(); // implement!
    state->renderFrame();
  }
};

答案 1 :(得分:2)

我猜你要找的是命令模式

阅读此详细说明(适用于C ++)

http://www.dreamincode.net/forums/topic/38412-the-command-pattern-c/

了解更多信息。

答案 2 :(得分:1)

我们需要更多信息。如果使RenderFrame成为虚函数,则可以使用运行时多态来调用RenderFrame的正确大小。

答案 3 :(得分:1)

除了Kerrek发布的多态方法(有些人称之为经典的面向对象方法),还有其他技术不使用多态。

  • 其中一个是table driven methods

  • 值得一提的另一个是访问者模式,已经在boost变体库中有效实现。这是an example,显示类似于您想要做的事情

答案 4 :(得分:1)

你还有多少个州?

WelcomeScreen()MenuScreen()的实现是否有可以移动到公共基类中的任何共同点?

如果第一个问题的答案是“其他几个”,或者第二个问题的答案“不多”,那么您的代码就可以了。如果可以,请保持简单。

继承,命令模式和其他建议的方法会使您的代码稍微复杂化,同时允许在将来添加更多状态时具有更大的灵活性。您更了解自己的应用并了解其未来发展方向。