我想为有限状态机定义一个抽象类。
class State
{
virtual State transit(const Input &i) = 0;
};
这个想法是我想要一个原型函数“ transit”,它接受输入并转换到下一个状态。不幸的是,编译器不允许这样做。
有没有办法提供这样的抽象类?
我认为是要提供状态机的摘要,对于一系列问题(例如接受输入并进入下一个状态等),无需更改状态机的运行逻辑。但是这种抽象并不关心状态和输入的定义方式,也许像下面这样。
template<S, I>
class StateMachine
{
public:
void set_initial_state(const S &is)
{
current_state = is;
}
void take_input(const I &input)
{
S next_state = current_state.transit(input);
current_state = next_state;
}
private:
S current_state;
};
使用此模板时,我想向“ S”提供更多提示。例如,它必须具有“运输”功能。这就是我提出的“状态”抽象类的想法。
答案 0 :(得分:2)
是的,有。
您的编译器不能让您返回一个State对象,因为它具有incomplete type
,因此它不知道如何构造它。您可能希望返回对this
的引用,例如cout的operator <<。
因为您尚未真正确定总体设计的外观,所以我不能为您提供很多帮助,但是我认为对于状态机来说,通常最好在内部放置一个StateMachine
和一个enum class
对于所有州。
class StateMachine {
enum class State{
state1,
state2,
};
virtual void changeState(State to) { /* do Something */}
};