我正在尝试用C++实现,这是C语言链接中描述的状态机:https://barrgroup.com/Embedded-Systems/How-To/Coding-State-Machines.
我创建了一个Fsm类,它实现了状态机的行为,还有一个machine类,它的方法将是state。
该代码有效,但当我试图将Machine方法的内存地址保存在State State__时,它会生成一个警告(-Wpmf转换(
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转换警告。
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__)() ;
}
唯一的问题可能是通过使用基成员函数指针来调用派生成员函数指针。幸运的是,正如这个优秀的答案所解释的那样,这是有保证的。