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

易格

我正在尝试使用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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

用一个协程实现一个有限状态机

来自分类Dev

用一个协程实现一个有限状态机

来自分类Dev

使用状态机作为另一个状态机的防护

来自分类Dev

如何解决Hadoop的警告:一个非法的反射访问操作错误发生在Ubuntu

来自分类Dev

如何解决C6386警告?

来自分类Dev

单元测试C时如何重置状态机

来自分类Dev

状态机状态始终返回最后一个状态,而不是初始状态

来自分类Dev

如何定义变量以检查python Django有限状态机中的上一个过渡

来自分类Dev

在目标C中用枚举实现状态机

来自分类Dev

如何解决变量初始化C ++的警告

来自分类Dev

如何解决问题:“至少一个对象必须实现IComparable。”

来自分类Dev

如何实现一个空对象?

来自分类Dev

一个如何实现Coq?

来自分类Dev

如何实现一个类?

来自分类常见问题

如何获得后退按钮以与AngularJS ui路由器状态机一起使用?

来自分类Dev

如何使用MSM Boost库运行同一子状态机的多个实例

来自分类Dev

不确定如何解决“数字表达式包含41个元素:仅第一个使用”的警告

来自分类Dev

我该如何解决...返回一个旧的或无效的状态实例的createState函数?

来自分类Dev

在 Swift/Objective-C 中实现下一个线程解决方案

来自分类Dev

如何解释UML 2.5状态机图?

来自分类Dev

如何解释UML 2.5状态机图?

来自分类Dev

在VHDL中实现状态机的替代方法

来自分类Dev

“通用”有限状态机实现

来自分类Dev

在Labview中实现分层状态机

来自分类Dev

如何在C ++中实现一个简单的多线程FileLogger?

来自分类Dev

如何使用另一个类(C#)中的变量实现搜索功能?

来自分类Dev

如何保证一个类在C#中实现特定的接口

来自分类Dev

如何创建一个抑制错误和警告的宏?

来自分类Dev

如何创建一个抑制错误和警告的宏?

Related 相关文章

  1. 1

    用一个协程实现一个有限状态机

  2. 2

    用一个协程实现一个有限状态机

  3. 3

    使用状态机作为另一个状态机的防护

  4. 4

    如何解决Hadoop的警告:一个非法的反射访问操作错误发生在Ubuntu

  5. 5

    如何解决C6386警告?

  6. 6

    单元测试C时如何重置状态机

  7. 7

    状态机状态始终返回最后一个状态,而不是初始状态

  8. 8

    如何定义变量以检查python Django有限状态机中的上一个过渡

  9. 9

    在目标C中用枚举实现状态机

  10. 10

    如何解决变量初始化C ++的警告

  11. 11

    如何解决问题:“至少一个对象必须实现IComparable。”

  12. 12

    如何实现一个空对象?

  13. 13

    一个如何实现Coq?

  14. 14

    如何实现一个类?

  15. 15

    如何获得后退按钮以与AngularJS ui路由器状态机一起使用?

  16. 16

    如何使用MSM Boost库运行同一子状态机的多个实例

  17. 17

    不确定如何解决“数字表达式包含41个元素:仅第一个使用”的警告

  18. 18

    我该如何解决...返回一个旧的或无效的状态实例的createState函数?

  19. 19

    在 Swift/Objective-C 中实现下一个线程解决方案

  20. 20

    如何解释UML 2.5状态机图?

  21. 21

    如何解释UML 2.5状态机图?

  22. 22

    在VHDL中实现状态机的替代方法

  23. 23

    “通用”有限状态机实现

  24. 24

    在Labview中实现分层状态机

  25. 25

    如何在C ++中实现一个简单的多线程FileLogger?

  26. 26

    如何使用另一个类(C#)中的变量实现搜索功能?

  27. 27

    如何保证一个类在C#中实现特定的接口

  28. 28

    如何创建一个抑制错误和警告的宏?

  29. 29

    如何创建一个抑制错误和警告的宏?

热门标签

归档