派生类中的C ++函数指针

时间:2015-03-26 18:43:14

标签: c++ inheritance function-pointers

这是我的问题:

我有一个基类,其中包含"注册"这堂课'使用函数指针函数到某个字符串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;函数指针作为一种类型,因为指针最后只是地址,不是吗?

2 个答案:

答案 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");
    }
};