运行时如何在一些方法之间进行选择?

问题描述 投票:0回答:5

为了让我的代码更清晰一些,我试图将一段很长的代码分成几个方法(有点像 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++ 吗?

c++ runtime
5个回答
2
投票

我猜您正在寻找的是 命令模式

阅读此详细说明(针对 C++)

http://web.archive.org/web/20120409061023/http://www.dreamincode.net/forums/topic/38412-the-command-pattern-c/

了解更多信息。


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
投票

我们需要更多信息。如果将 RenderFrame 设为虚函数,则可以使用运行时多态性来调用 RenderFrame 的正确情况。


1
投票

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

  • 其中之一是表驱动方法

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


1
投票

您还有多少个其他州?

WelcomeScreen()
MenuScreen()
的实现有什么共同点可以移入公共基类吗?

如果第一个问题的答案是“其他一些”或者第二个问题的答案是“不多”,那么你的代码就很好。如果可以的话,让事情变得简单。

建议的继承、命令模式和其他方法将使您的代码变得有点复杂,同时允许将来更灵活地添加更多状态。您更了解您的应用程序并知道它的未来。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.