我正在尝试使用C ++实现,此链接针对C语言描述了状态机:https : //barrgroup.com/Embedded-Systems/How-To/Coding-State-Machines。
我创建了一个Fsm类和一个Machine类,该类实现状态机的行为,该类的方法将是状态。
该代码有效,但是当我尝试以State状态__保存Machine方法的内存地址时,它会生成警告(-Wpmf-conversions)
class Fsm
{
public:
typedef void (*State)();
private:
State state__;
public:
Fsm(State state);
void dispatch();
};
Fsm::Fsm(State state)
{
state__ = state ;
} //Fsm
void Fsm::dispatch()
{
(*state__)() ;
}
class Machine : public Fsm
{
public:
Machine() : Fsm((State)&Machine::initial) {} // ctor
};
我希望解决-Wpmf-conversions警告。
State
确实对应于一个函数指针。
不幸的是,您尚未initial
在代码中提供的定义。所以有点猜测。但是在构造函数的参数中,(State)&Machine::initial
您似乎假设它是静态成员函数。
编译时不会出现错误或警告:
class Machine : public Fsm
{
static void initial(); // make sure it's static
public:
Machine() : Fsm((State)&Machine::initial) {} // ctor
};
现在,如果您想要一个指向成员函数的指针,那就另当别论了。首先,您需要相应地定义State
:
typedef void (Fsm::*State)();
然后dispatch
必须调用一个成员函数:
void Fsm::dispatch()
{
(this->*state__)() ;
}
唯一的问题可能是您通过使用基本成员函数指针来调用派生成员函数指针。幸运的是,这是可以保证的,正如这个出色的答案所述。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句