实现 C++ 状态机。如何解决 Wpmf 转换警告?
Implementig a C++ State Machine. How to solve Wpmf-convesion Warning?
我正在尝试用 C++ 实现,此 link 中针对 C 语言描述的状态机:https://barrgroup.com/Embedded-Systems/How-To/Coding-State-Machines。
我创建了一个 Fsm class,它实现了状态机的行为,还有一个机器 class,其方法就是状态。
该代码有效,但当我尝试在状态 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__)() ;
}
唯一的问题可能是您使用基成员函数指针调用派生成员函数指针。幸运的是,这保证有效,如 中所述。
我正在尝试用 C++ 实现,此 link 中针对 C 语言描述的状态机:https://barrgroup.com/Embedded-Systems/How-To/Coding-State-Machines。
我创建了一个 Fsm class,它实现了状态机的行为,还有一个机器 class,其方法就是状态。
该代码有效,但当我尝试在状态 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__)() ;
}
唯一的问题可能是您使用基成员函数指针调用派生成员函数指针。幸运的是,这保证有效,如