为了使其工作 - 为 getter 和 setter 定义 C 样式包装器,如下例所示:
为你的班级
class Klass {
public:
int getA() const;
void setA(int);
virtua int getB() const;
};
定义包装此类的 C 结构:
typedef int (*GetInt)(void*);
typedef void (*SetInt)(void*,int);
// and similar for other types
struct KlassCInterface {
void* object;
GetInt getA;
SetInt setA;
GetInt getB;
};
extern "C" int getA(void* obj)
{
return static_cast<Klass*>(klassObj)->getA();
}
...
KlassCInterface* getCInterface(Klass* obj)
{
// malloc just in case your client want to use free()
KlassCInterface* retVal = (KlassCInterface*)malloc(sizeof(KlassCInterface));
retVal->object = obj;
retVal->getA = &getA;
...
return retVal;
}
当您传递 void* 数据时,将其作为 C 接口结构传递:
Klass* obj = new Klass(...);
KlassCInterface* objC = getCInterface(obj);
registerData(objC);
在您的 C 代码中 - 使用此 C 接口:
void doSthWihtKlass(void* data)
{
KlassCInterface* objC = (KlassCInterface*)data;
printf("%d\n", objC->getA(objC->object));
}