【问题标题】:How to fill a function pointer member with class instance member function pointer?如何用类实例成员函数指针填充函数指针成员?
【发布时间】:2015-04-25 02:09:17
【问题描述】:

拥有一个 C API,我需要创建一个 C++ 对象,像这样扩展它:

struct OldCInterface {
   void (*doStuff)();
};

struct NewCXXBaseClass : protected OldCInterface {
   virtual void doStuff(); 
   virtual ~NewCXXBaseClass();
};

如果可能的话,如果我们有 Base child,如何将指向 CXX doStuff 的实例指针放入构造函数中的 C 接口中,使其指向重载?

【问题讨论】:

    标签: c++ c function interface function-pointers


    【解决方案1】:

    void (*doStuff)()如果是函数指针,而&NewCXXBaseClass::doStuffvoid (NewCXXBaseClass::*)()类型,即指向成员函数的指针。它们不兼容。通常,它们的大小甚至都不相同 (sizeof(void (*)()) != sizeof(void (NewCXXBaseClass::*)()))。这么说,以下是正确的

    struct OldCInterface {
       void (NewCXXBaseClass::*doStuff)();
    };
    

    但是由于您的初衷是使用一些旧的 C 代码。这可能不起作用。最好的办法是创建一个静态成员函数,调用某个对象的虚拟成员函数。插图:

    struct Proxy {
      static NewCXXBaseClass* s_p_;
      static void DoStuff() {
        s_p_->DoStuff();
      }
    };
    

    &Proxy::DoStuffvoid(*)() 类型,可用于需要函数指针的地方。然后,您可以执行以下操作:

    OldCInterface c_interface = {&Proxy::DoStuff};

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-29
      • 2018-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多