如何在运行时在某些方法之间进行选择
How to choose between some methods at 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++难道没有"更好"的方法吗?
我想您正在寻找的是命令模式。
阅读此详细解释(针对C++)
http://www.dreamincode.net/forums/topic/38412-the-command-pattern-c/
了解更多信息。
首先,您的私有变量应声明为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();
}
};
我们需要更多信息。如果将RenderFrame设为虚拟函数,则可以使用运行时多态性来调用RenderFrame的正确大小写。
除了Kerrek发布的多态方法(有些人称之为经典的面向对象方法),还有其他技术不使用多态性。
-
其中之一是表驱动方法
-
另一个值得一提的是访问者模式,它已经在boost变体库中有效地实现了。这里有一个例子,显示了类似于你想做的事情
您还有多少其他状态?
WelcomeScreen()
和MenuScreen()
的实现有什么共同点可以移动到一个公共基类中吗?
如果第一个问题的答案是"其他几个",或者第二个问题的回答是"不多",那么您的代码就可以了。如果可以的话,保持简单。
继承、命令模式和建议的其他方法会使代码稍微复杂一些,同时允许在未来添加更多状态时有更大的灵活性。你更了解你的应用程序,知道它的未来。
- 如何防止clang格式在流运算符调用之间添加换行符<<
- 引号之间匹配/不匹配,带有不可避免的引号和多行
- 计算所选行的总和
- 通过USB在PC和Arduino之间进行串行通信
- 正则表达式 获取两个换行符之间的文本
- 如果我在下面的代码中使用 list 而不是 vector,为什么在我尝试在迭代器之间执行减法的行中编译失败?
- Arduino上的串行和流之间有什么区别,以及如何实现序列
- 一条线和两行声明之间的差异
- ESP8266和ATMEGA328P之间的串行通信
- 如何从 gtkmm 树视图中获取所选行
- openssl rc4 命令行加密和 cpp 文件实现 rc4 之间的区别
- 如何在多行文本C++的左上角显示复选框
- 如何将所选行的第一列值绑定到变量并在 QT 的 SQL 命令中使用它?
- 嵌入式串行读取操作和桌面PC之间可能有什么区别
- 数组之间的特征行交叉积
- 我的编译行和我的生成文件之间的区别可能导致错误
- 在文件中找到最长的行,签名和未签名的整数表达式之间的比较
- 使用 Qt 获取 csv 文件中两行之间所有行
- c++和arduino之间的串行通信
- 如何在Visual Studio中进行串行端口编程C++Windows和Linux之间的可移植性?