拥有一个C API我需要创建一个C ++对象,扩展它如下:
struct OldCInterface {
void (*doStuff)();
};
struct NewCXXBaseClass : protected OldCInterface {
virtual void doStuff();
virtual ~NewCXXBaseClass();
};
如果我们有Base子节点,如果可能将指针指向重载,如何将实例指针放到构造函数的C接口中的CXX doStuff?
答案 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};