gpt4 book ai didi

C++ - 在运行时从基类指针识别派生类

转载 作者:行者123 更新时间:2023-11-27 22:41:06 25 4
gpt4 key购买 nike

我正在试验状态机,我正在尝试实现的状态机使用函数指针来表示状态

typedef void (*State)(Signal const&)

class StateMachine
{
public:
void exampleState(Signal const&);
private:
State m_currentState;
}

基本上,我想为每个信号派生一个单独的类,并且在每个状态函数中,状态机必须能够确定已接收到哪种信号并执行相应的代码。我想出的解决方案是类似

class Signal {};
class MySignal: public Signal {};

void StateMachine::exampleState(Signal const& signal){
if (typeid(signal) == typeid(MySignal)){
//code here
}
// other cases...
}

首先,我不确定以这种方式使用 typeid 是一种好的做法。此外,这仅在 Signal 具有至少一个虚函数时才有效。

另一种解决方案是定义一种类似枚举的类型标志,并在派生信号构造函数中传递相应的标志

enum signalType{
mySignalType
//other types
}

class Signal {
public:
Signal(signalType sig_type):m_type(sig_type){};
const signalType m_type;
};

class MySignal: public Signal {
public:
MySignal():Signal(mySignalType){};
};

void StateMachine::exampleState(Signal const& signal){
switch (signal.m_type){
case mySignalType:
//code here
break;
// other cases...
}
}

虽然这需要在每次写入新信号类时扩展枚举。

是否有更优雅的方法来实现这一目标?或者也许是另一种完全避免这种检查的技术?我记得在其他情况下也有这个问题,这就是为什么标题中的问题比上面的例子更笼统。

最佳答案

你想实现的可以通过多态来实现。

Signal中声明一个方法(或抽象方法),并在MySignal中实现:

class Signal {
public:
virtual void my_method() const = 0;
};

class MySignal: public Signal {
public:
void my_method() const override {
// do something
}
};

然后在 exampleState 中调用您的方法,这将调用已实现的方法:

void StateMachine::exampleState(Signal const& signal){
signal.my_method();
}

关于C++ - 在运行时从基类指针识别派生类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49057225/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com