c++ - 实现 C++ 状态机。如何解决 Wpmf 转换警告?

标签 c++ casting function-pointers compiler-warnings state-machine

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

我已经创建了一个 Fsm 类,它实现了状态机的行为,以及一个 Machine 类,它的方法就是状态。

代码有效,但当我尝试在 State 状态下保存机器方法的内存地址时,它会生成警告 (-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__)() ;
}

唯一的问题可能是您使用基成员函数指针调用派生成员函数指针。幸运的是,这保证有效,如 this excellent answer 中所述。 .

关于c++ - 实现 C++ 状态机。如何解决 Wpmf 转换警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58721503/

相关文章:

c++ - glibc 检测 smallbin 链表损坏

c++ - 如何比类中的成员变量更早调用构造函数?

c++ - 继承与类型转换

python - 无法在 pybind11 中绑定(bind)重载的静态成员函数

android - 具有 native 代码支持的跨平台移动框架

c++ - 将 x86 代码注入(inject) x64 进程

c - 从线程返回 "string"

你能假设类型转换指针是安全的吗?

C - 应用于矩阵的函数指针。段错误

c++ - 函数将返回一个字符串,其中包含两个索引之间的部分