2011-09-03 82 views
1

在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

成员函数模板的定义应该是这样的:

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

也就是说,它应该是简单的,而不是setStatesetState<T>。后一种语法用于功能模板专业化。由于T是一个类型参数,专业化将被视为功能部分模板特化是不允许的。

+0

啊,我原本试过,但得到了(并仍然得到)一个'未定义的引用'void stateManager :: setState ()''错误。 – Jookia

+0

嗯,只是想通了:该方法必须在头,而不是在cpp文件。 – Jookia

+1

@Konrad:StateManager不是类模板。 – Nawaz

1

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

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

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