C ++:如何编写此抽象类?

时间:2019-09-26 21:21:06

标签: c++

我想为有限状态机定义一个抽象类。

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”提供更多提示。例如,它必须具有“运输”功能。这就是我提出的“状态”抽象类的想法。

1 个答案:

答案 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 */}
};