一个基于类的状态机?

时间:2011-09-03 12:30:50

标签: c++ class templates 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以来这不起作用。

除了非OO之外,还有更好的方法吗?

3 个答案:

答案 0 :(得分:3)

成员函数模板的定义应为:

template <class T>
void stateManager::setState(void)
{
   //...
}

也就是说,它应该只是setState而不是setState<T>。后一种语法用于函数模板特化。由于T是一个类型参数,因此特殊化将被视为函数部分模板特化,这是不允许的。

答案 1 :(得分:1)

很难说没有细节,但你可以做一个基础State类,不同的状态继承它。

如果您仍想使用类,您可以看到一个有趣的 example using boost.mpl

答案 2 :(得分:1)

避免使用模板的另一个选项是为游戏状态定义纯虚拟基类,然后将对不同游戏状态的引用传递给您的函数。例如,

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