为了让我的代码更清晰,我试图将一长段代码分成几个方法(类似于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 ++?
答案 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()
的实现是否有可以移动到公共基类中的任何共同点?
如果第一个问题的答案是“其他几个”,或者第二个问题的答案“不多”,那么您的代码就可以了。如果可以,请保持简单。
继承,命令模式和其他建议的方法会使您的代码稍微复杂化,同时允许在将来添加更多状态时具有更大的灵活性。您更了解自己的应用并了解其未来发展方向。