我正在尝试用 C++ 包装 C 库。该库定义了一些回调函数,例如 void (*callback)(void*)
,显然在我的 OO 类中它必须是静态的。
我的问题是从回调函数中找到类的正确实例。回调参数在创建对象时是未知的。
class CObj
{
public:
CObj()
{
c_lib_start(CObj::CallbackFunc);
}
static void CallbackFunc(void* arg)
{
c_lib_type* data = (c_lib_type*)arg;
// ... handle data callback
}
}
int main(int argc, char* argv[])
{
CObj obj1;
CObj obj2; // will call the same callback function as obj1! can this be avoided?
}
编辑:
经过一番思考,我的最佳解决方案草案:
class CObj
{
public:
CObj(void (*pFuncPtr)(void*))
{
c_lib_start(pFuncPtr);
}
void CallbackFunc(void* arg)
{
c_lib_type* data = (c_lib_type*)arg;
// ... handle data callback
}
}
// globals. templated?
CObj* g_obj1 = NULL;
void FuncPtr1(void* arg) { g_obj1->CallbackFunc(arg); }
CObj* g_obj2 = NULL;
void FuncPtr2(void* arg) { g_obj2->CallbackFunc(arg); }
int main(int argc, char* argv[])
{
g_obj1 = new CObj(FuncPtr1);
g_obj2 = new CObj(FuncPtr2);
}
最佳答案
有用的 C 回调函数具有类似 R function(void* user_data)
的签名或带有附加参数 R function(A0 a0, A1 a1, ... AN an, void * 用户数据)
。 C 库应该提供像 register_function(function_type, void* user_data) 这样的函数。
这样,您就可以通过调用 register_function(&Class::static_member_function, this) 来注册一对 C++ 对象和静态成员函数。 在调用时,您将用户数据转换为传递给注册的类对象。
如果没有上述内容,您将陷入两难境地。您将调用对象存储在一个全局变量中,并在回调函数中使用它,使回调仅限于单个对象!
关于c++ - 面向对象设计 : Multiple instances but Static Callbacks,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23542896/