C++ - 在运行时从基类指针标识派生类
C++ - Identify derived class from base class pointer at runtime
我正在试验状态机,我尝试实现的状态机使用函数指针来表示状态
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...
}
}
althoug 这要求每次写入新的信号类时扩展枚举。
有没有更优雅的方式来实现这一目标?或者也许另一种完全避免这种检查的技术?我记得在其他情况下也遇到过这个问题,这就是为什么标题中的问题比上面的例子更通用的原因。
你想要实现的目标可以通过多态性来完成。
在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();
}
使用dynamic_cast
而不是typeid
:
class Signal {
public:
virtual ~Signal() {}
};
class MySignal: public Signal {};
void StateMachine::exampleState(Signal const& signal){
if (dynamic_cast<MySignal const *>(&signal)){
//code here
}
// other cases...
}
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 数组的指针从不分段故障
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 何时在引用或唯一指针上使用移动语义
- QMetaObject invokeMethod的基于函数指针的语法
- C++ - 在运行时从基类指针标识派生类
- 共享指针交换方法标识更改
- 如何唯一标识指向成员函数的指针
- std::is_const 将常量指针标识为非常量指针
- 如何从lldb执行一个函数(由指针标识)
- c++中使用指针的对象类型标识
- 给定指向其基类的指针来标识子类
- c++指针和指针的标识在内存分配方面
- 使用运行时类型标识从空指针获取数据