如何用类实例成员函数指针填充函数指针成员?

时间:2015-04-25 02:09:17

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

拥有一个C API我需要创建一个C ++对象,扩展它如下:

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

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

如果我们有Base子节点,如果可能将指针指向重载,如何将实例指针放到构造函数的C接口中的CXX doStuff?

1 个答案:

答案 0 :(得分:2)

void (*doStuff)()如果函数指针,&NewCXXBaseClass::doStuff类型为void (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::DoStuff的类型为void(*)(),可用于需要函数指针的位置。然后,您可以执行以下操作:

OldCInterface c_interface = {&Proxy::DoStuff};