这是我的问题:
我有一个基类,其中包含"注册"这堂课'使用函数指针函数到某个字符串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) );
}
我需要的是,能以某种方式存储和处理不同的课程。函数指针在一个列表中,并且能够在继承链的最高级别调用它们(每个派生类可以添加自己需要注册的函数)。
我觉得很奇怪,我不能存储不同的课程&#39;函数指针作为一种类型,因为指针最后只是地址,不是吗?
答案 0 :(得分:1)
您无法为此使用非静态类方法。 C ++没有&#34; closures&#34;的概念,它允许派生方法指针被分配给基类方法指针并从中调用。您将不得不使用不同的设计。例如,您可以存储BaseClass
对象指针的列表(因为您无论如何都需要它们来调用非静态类方法),然后在需要时可以对这些对象调用virtual
方法并让每个派生类根据需要覆盖该方法。
答案 1 :(得分:1)
如果您不需要BaseClass
的集合,则可以使用模板,并将派生类型传递到模板中。
template <typename DERIVED>
class BaseClass {
std::map<std::string, void (DERIVED::*)( argType* )> actionMap;
protected:
void registerAction(
void (DERIVED::*)( argType* ), std::string actionID);
//...
};
class Derived : public BaseClass<Derived> {
//...
Derived () {
registerAction(&sendEthernetFrame, "myAction");
}
};