C++ 使用指向成员函数的指针时发生编译错误

C++ 使用指向成员函数的指针时发生编译错误,c++,C++,这是状态机设计模式的一个示例。。我面临一些问题,请解释并给出解决方案 代码如下: #include <iostream> using namespace std; class Machine { class State *current; public: Machine(); void setCurrent(State *s) { current = s; } void on(); void off(); };

这是状态机设计模式的一个示例。。我面临一些问题,请解释并给出解决方案

代码如下:

#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
  };
  Machine fsm;
  int num;
  while (1)
  {
    cout << "Enter 0/1: ";
    cin >> num;
    (fsm. *ptrs[num])();
  }
}
#包括
使用名称空间std;
类机器
{
类别状态*电流;
公众:
机器();
无效设置当前(状态*s)
{
电流=s;
}
在()上无效;
作废();
};
阶级国家
{
公众:
上的虚拟无效(计算机*m)
{
关上(这个);
}
课程名称:公共国家
{
公众:
关于()
{
cout有两个错误:

第一,运算符的地址对于创建指向成员的指针是必需的。因此,它们的数组初始化应该是:

void(Machine:: *ptrs[])() = 
{
  &Machine::off, &Machine::on
};
第二,取消对成员指针的引用的运算符是
*
。它是单个标记,因此不允许使用空格:

(fsm.*ptrs[num])();
有两个错误:

第一,运算符的地址对于创建指向成员的指针是必需的。因此,它们的数组初始化应该是:

void(Machine:: *ptrs[])() = 
{
  &Machine::off, &Machine::on
};
第二,取消对成员指针的引用的运算符是
*
。它是单个标记,因此不允许使用空格:

(fsm.*ptrs[num])();

这里有太多奇怪的东西,我不知道从哪里开始。首先,听听你的编译器……你试图使用关闭和打开方法,就像它们是静态的一样。你需要一个机器对象的实例才能使用它们。@ScoPi他有一个:
fsm
。是初始值设定项列表和调用程序被破坏了(后者字面上由一个空格表示)我的建议是不写这样的C++。这里有很多奇怪的东西,我不知道从哪里开始。一,听你的编译器…你试图使用Onand方法,比如静态。你需要一个机器对象的实例来使用它们。@ ScoPi有一个:<代码> FSM < /Cord>。Ialisher列表和调用器被破坏(后者由一个单一的空间)。我的建议是不写C++的样子。