【问题标题】:C++ function pointers in derived classes派生类中的 C++ 函数指针
【发布时间】:2015-03-26 18:43:14
【问题描述】:

这是我的问题:

我有一个基类,其中包含一个使用函数指针将此类函数“注册”到某个字符串 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) );
}

我需要的是,能够以某种方式在一个列表中存储和寻址不同类的函数指针,并能够在继承链的最高级别调用它们(每个派生类都可以添加自己的函数,这些函数将需要注册)。

我觉得很奇怪,我不能将不同类的函数指针存储为一种类型,因为指针最终只是地址,不是吗?

【问题讨论】:

  • 我认为如果不使用诸如std::function 之类的某种类型擦除,就无法做到这一点。

标签: c++ inheritance function-pointers


【解决方案1】:

您将无法为此使用非静态类方法。 C++ 没有“闭包”的概念,它允许将派生方法指针分配给基类方法指针并从中调用。您将不得不使用不同的设计。例如,您可以存储BaseClass 对象指针列表(因为无论如何您都需要它们来调用非静态类方法),然后在需要时可以在这些对象上调用virtual 方法并让每个派生类根据需要覆盖该方法。

【讨论】:

  • 嗯,问题是,我事先不知道派生类中会有什么方法。这个想法是,用户可以创建一个派生类并向其添加一个函数。然后,通过注册它,在非常基类中编码的函数可以考虑这个新定义的函数(基于 stringID)。好吧,我想我将不得不尝试另一种设计。
【解决方案2】:

如果您不需要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");
    }
};

【讨论】:

    猜你喜欢
    • 2017-07-18
    • 2014-02-06
    • 2014-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多