这是我的问题:
我有一个基类,其中包含一个使用函数指针将此类函数“注册”到特定字符串 ID 的方法。我设法让它工作,但我需要派生类也能够使用这种机制。编译器强制我使用包含被调用函数的类名指定函数指针(符号 BaseClass::*
)。当我创建派生类时,这显然行不通。
这是我目前在基类中的简化代码(我将它分为 .hh 和 .cc 文件 - 这就是实现分离的原因):
class BaseClass{
public:
BaseClass();
private:
std::map<std::string, void (BaseClass::*)( argType* )> actionMap;
void registerAction( void (BaseClass::*)( argType* ), std::string actionID );
}
BaseClass::BaseClass(){
std::string actionID = "myAction";
void (BaseClass::*fcnPointer)(argType*);
fcnPointer = &BaseClass::sendEthernetFrame;
registerAction( fcnPointer, actionID );
}
void BaseClass::registerAction( void (BaseClass::*actionHandler)( argType* ), std::string actionID ){
actionMap.insert ( std::pair<std::string,void (BaseClass::*)(argType*)>(actionID ,actionHandler) );
}
我需要的是,能够以某种方式在一个列表中存储和寻址不同类的函数指针,并能够在继承链的最高级别调用它们(每个派生类都可以添加自己的函数,这些函数将需要注册)。
我觉得很奇怪,我不能将不同类的函数指针存储为一种类型,因为指针最终只是地址,不是吗?
最佳答案
您将无法为此使用非静态类方法。 C++ 没有“闭包”的概念,闭包允许将派生方法指针分配给基类方法指针并从中调用。您将不得不使用不同的设计。例如,您可以存储 BaseClass
对象指针列表(因为无论如何您都需要它们来调用非静态类方法),然后在需要时可以调用 virtual
这些对象上的方法,并让每个派生类根据需要覆盖该方法。
关于派生类中的 C++ 函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29286456/