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++的样子。