基于类的状态机
A class-based state machine?
在c++中,我正在尝试为游戏制作一个基于类的简单状态机。
stateMan.setState<mainMenuState>();
我有一个类,声明为:
class stateManager
{
...
template <class T>
void setState(void);
}
测试代码为:
template <class T>
void stateManager::setState<T>(void)
{
T* blah = new T;
delete blah;
}
显然,这不起作用,因为function template partial specialization ‘setState<T>’ is not allowed
。
除了非面向对象之外,是否有更好的方法来做到这一点?
成员函数模板的定义应该是:
template <class T>
void stateManager::setState(void)
{
//...
}
也就是说,它应该是简单的setState
而不是setState<T>
。后一种语法用于函数模板专门化。由于T
是类型参数,特殊化将被视为函数部分模板特殊化,这是不允许的。
没有细节很难说,但是您可以做一个基本的State
类,并从它继承不同的状态。
如果您仍然希望使用类来实现这一点,您可以看到一个有趣的使用boost.mpl.
另一个避免模板的选择是为你的游戏状态定义一个纯虚拟基类,然后将对不同游戏状态的引用传递给你的函数。例如,
//pure virtual base class that will define the state interfaces
class base_state { /*...*/ };
//a derived state class
class mainMenuState : public base_state { /*...*/ };
class stateManager
{
//...
//you can pass any derived base_state to this function
void setState(base_state* state);
};
相关文章:
- 如何添加依赖于类本身的模板成员变量
- 为什么同时覆盖全局新运算符和特定于类的运算符不是模棱两可的行为?
- 如何在使用 Boost MSM 编写的状态机中直接访问任何状态
- 依赖于类成员属性的类实例成员
- 启动状态机无法在启动时处理内部转换
- 实现C++状态机.如何解决Wpmf对流警告
- 无法使用模板参数编译提升元状态机
- Boost状态机语言-"操作"中的"发布"事件
- 将C++数据模型与Qt SCXML状态机一起使用
- 如何在 boost::msm 中实现可以访问状态机 (SM) 的后端/前端的"BaseState"
- 分层状态机涉及哪些原则,以及如何实现基本模型?
- 如何在状态内创建状态机?
- 为什么 std::vector 适用于类定义中的不完整类型?
- 状态机与开关情况
- 如何让成员函数实现依赖于类的模板参数?
- 仅将方法应用于类的一个对象
- C++状态机,继承了具有语法不正确的成员值的类
- 基于类的状态机
- 应用于嵌入式状态机的设计
- 状态机、子类和函数指针