1


尝试编译此程序时出现三个错误。

我期待以下输出

OFF-ctor
输入 0/1:0 已经 OFF
输入 0/1:1
从 OFF 到 ON ON-ctor dtor-OFF
输入 0/1:1
已经 ON
输入 0/1:0
从 ON 到 OFF OFF-ctor dtor-ON
输入 0/1:1
从关闭到打开 ON-ctor dtor-OFF
输入 0/1:0
从打开到关闭 OFF-ctor dtor-ON
输入 0/1:0
已经关闭 输入 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++ 中运行它。请帮忙。

4

2 回答 2

3

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

对于另一个,您需要意识到这.*是一个单一的标记,因此您需要删除两个字符之间的空格:(fsm.*ptrs[num])();

于 2013-02-26T06:42:46.480 回答
2
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]
于 2013-02-26T06:44:28.730 回答