状态设计模式 - 编译错误

时间:2013-02-26 06:37:59

标签: c++ design-patterns compiler-errors


我尝试编译此程序时遇到三个错误。

我期待以下输出

  

OFF-ctor
输入0/1:0已经OFF输入0/1:1   
从OFF变为ON ON-ctor dtor-OFF
输入0/1:1
  已打开输入0/1:0从ON到OFF OFF-ctor   dtor-ON
输入0/1:1
从OFF变为ON ON-ctor   dtor-OFF
输入0/1:0从ON到OFF OFF-ctor   dtor-ON
输入0/1:0
已经OFF输入0/1:

以下是该计划

    #include <iostream>
    using namespace std;
    class Machine
    {
      class State *current;
      public:
        Machine();
        void setCurrent(State *s)
        {
            current = s;
        }
        void on();
        void off();
    };

    class State
    {
      public:
        virtual void on(Machine *m)
        {
            cout << "   already ON\n";
        }
        virtual void off(Machine *m)
        {
            cout << "   already OFF\n";
        }
    };

    void Machine::on()
    {
      current->on(this);
    }

    void Machine::off()
    {
      current->off(this);
    }

    class ON: public State
    {
      public:
        ON()
        {
            cout << "   ON-ctor ";
        };
        ~ON()
        {
            cout << "   dtor-ON\n";
        };
        void off(Machine *m);
    };

    class OFF: public State
    {
      public:
        OFF()
        {
            cout << "   OFF-ctor ";
        };
        ~OFF()
        {
            cout << "   dtor-OFF\n";
        };
        void on(Machine *m)
        {
            cout << "   going from OFF to ON";
            m->setCurrent(new ON());
            delete this;
        }
    };

    void ON::off(Machine *m)
    {
      cout << "   going from ON to OFF";
      m->setCurrent(new OFF());
      delete this;
    }

    Machine::Machine()
    {
      current = new OFF();
      cout << '\n';
    }

    int main()
    {
      void(Machine:: *ptrs[])() =
      {
        Machine::off, Machine::on//Error2->invalid use of non-static member function 'void Machine::off()'
//Error3->invalid use of non-static member function 'void Machine::on()'
      };
      Machine fsm;
      int num;
      while (1)
      {
        cout << "Enter 0/1: ";
        cin >> num;
        (fsm. *ptrs[num])(); //Error1->expected unqualified-id before '*' token
      }
    }

该代码来自sourcemaking.com的州设计模式。 我在eclipse和linux g ++中运行它。 请帮助。

2 个答案:

答案 0 :(得分:2)

要获取指向成员函数的指针,您需要使用&(即使它是可选的,用于获取指向非成员函数的指针):&Machine::off, &Machine::on

另一方面,您需要意识到.*是一个令牌,因此您需要删除两个字符之间的空格:(fsm.*ptrs[num])();

答案 1 :(得分:1)

void (Machine::*ptrs[])() =
  {
    &Machine::off,  // note: explicit &
    &Machine::on
  };
Machine fsm;
int num;
while (1)
{
    cout << "Enter 0/1: ";
    cin >> num;
    (fsm.*ptrs[num])();  // note: no space between . and *
}

仍然留下以下警告:

try.cc:19:22: warning: unused parameter 'm' [-Wunused-parameter]
try.cc:23:22: warning: unused parameter 'm' [-Wunused-parameter]
try.cc: In member function 'virtual void OFF::on(Machine*)':
try.cc:68:20: warning: deleting object of polymorphic class type 'OFF' which has non-virtual destructor might cause undefined behaviour [-Wdelete-non-virtual-dtor]
try.cc: In member function 'virtual void ON::off(Machine*)':
try.cc:76:14: warning: deleting object of polymorphic class type 'ON' which has non-virtual destructor might cause undefined behaviour [-Wdelete-non-virtual-dtor]