【发布时间】:2014-05-08 13:17:30
【问题描述】:
我正在尝试将 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_lib_type有一个客户提供数据的字段,您可以使用它。否则,恐怕你倒霉了。 -
c_lib_type是什么? -
回调是否可以在任何时候突然发生,还是仅在您的应用程序执行涉及已知 CObj 实例的某些操作时发生?如果是后者,您可以求助于丑陋的解决方案,将
static CObj* currentThis放入 CObj 并在触发回调之前将其设置为正确的值。 -
@DieterLücking c_lib_type 是一种抽象数据类型,源自 C 库。
-
@dlf 回调可能随时发生。