C++ 状态设计模式:错误处理

C++ 状态设计模式:错误处理,c++,design-patterns,state,C++,Design Patterns,State,我只是在玩弄“状态设计模式”,有几个问题是关于在状态机中如何准确地处理错误的。让我们看看下面的例子 class state_machine { private: state state1; state state2; public: } class state { private: state_machine* m_state_machine; /** Will pass the pointer to states **/ publi

我只是在玩弄“状态设计模式”,有几个问题是关于在状态机中如何准确地处理错误的。让我们看看下面的例子

class state_machine
{
  private:
   state state1;
   state state2;

  public:

}

class state
{
   private: 
       state_machine*  m_state_machine;    /** Will pass the pointer to states **/
   public: 
     void perform_state1_action();
     void perform_state2_action();
}

class state1: public state
{
   public:
     void perform_state1_action()
      {
         /**
            Functionality
         **/
      }

     void perform_state2_action();   // Have nothing to do for this function


}


class state2: public state
{
   public:
     void perform_state2_action()
      {
         /**
            Functionality
         **/
      }

     void perform_state1_action();   // Have nothing to do for this function


}

我的问题是如何优雅地处理在状态1中调用perform_state2_action的情况。我是否编写了一个没有错误记录功能的基本函数实现?

此设计模式要求您提供适用于每个状态的公共方法。如果您遇到一种情况,您感到迫切需要添加一个仅对其中一个有效的操作,这可能意味着以下情况之一:

  • 您应该将其设置为私有,并从更通用的公共方法调用它,这些方法可以在您的所有州实现
  • 此方法应移到状态机之外,因为它与状态无关
  • 这是一种特殊情况,其中空实现是一种正确的行为(因此不需要错误日志)
  • 您选择了错误的设计模式

我决定使用州设计模式,但做了一些小改动:

为“do_task”之类的函数使用通用名称,并使用该名称调用所需的私有函数


这提供了状态设计模式的好处,同时防止创建多余的绝对虚拟函数

为什么状态机有两个状态成员,而这两个状态成员似乎都可以执行这两种状态。