基于类的状态机

A class-based state machine?

本文关键字:状态机 于类      更新时间:2023-10-16

在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); 
};