实现一个C ++状态机。如何解决Wpmf-convention警告?

我正在尝试用C ++实现,此链接针对C语言https://barrgroup.com/Embedded-Systems/How-To/Coding-State-Machines描述了状态机。

我创建了一个Fsm类和一个Machine类,该类实现状态机的行为,该类的方法将是状态。

代码有效,但是当我尝试以状态state__保存Machine方法的内存地址时,它会生成警告(-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-conversions警告。

linlin1988124 回答:实现一个C ++状态机。如何解决Wpmf-convention警告?

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__)() ;
}

唯一的问题可能是您通过使用基本成员函数指针来调用派生成员函数指针。幸运的是,如this excellent answer中所述,保证可以正常工作。

本文链接:https://www.f2er.com/3155603.html

大家都在问