c++ - 面向对象设计 : Multiple instances but Static Callbacks

标签 c++ c oop callback

我正在尝试用 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/

相关文章:

c++ - 奇怪的指针语法

c++ - 将端口号绑定(bind)到 TCP 套接字(出站)以发送数据包

C++:如何调用具有多个参数的基类构造函数?

C++ 全局结构创建名称冲突

c++ - 快速排序迭代

c - 我对这个 if 语句的否定是否正确?

c - C工程编译的时候怎么最后没有创建main.o?

c++ - 带有类getter函数的奇怪输出C++

java - OOP 二十一点游戏(创建牌组)

c# - 如何在 C# 中读取作为终端输入的二进制文件