相关疑难解决方法(0)

使用C++类成员函数作为C回调函数

我有一个C库,需要注册回调函数来定制一些处理.回调函数的类型是int a(int *, int *).

我正在编写类似于以下内容的C++代码,并尝试将C++类函数注册为回调函数:

class A {
  public:
   A();
   ~A();
   int e(int *k, int *j);
};

A::A()
{
   register_with_library(e)
}

int
A::e(int *k, int *e)
{
  return 0;
}

A::~A() 
{

}
Run Code Online (Sandbox Code Playgroud)

编译器抛出以下错误:

In constructor 'A::A()',
error:
 argument of type ‘int (A::)(int*, int*)’ does not match ‘int (*)(int*, int*)’.
Run Code Online (Sandbox Code Playgroud)

我的问题:

  1. 首先是可以注册一个C++类的memeber函数,就像我想要做的那样,如果是这样的话怎么样?(我在http://www.parashift.com/c++-faq-lite/mixing-c-and-cpp.html上阅读了32.8 .但在我看来它并没有解决问题)
  2. 是否有替代/更好的方法来解决这个问题?

c c++ interop callback

45
推荐指数
4
解决办法
5万
查看次数

C++:路由到成员函数的静态函数包装器?

我尝试过各种各样的设计方法来解决这个问题,但我似乎无法做到这一点.

我需要公开一些静态函数来用作C lib的回调函数.但是,我希望实际的实现是非静态的,所以我可以使用虚函数并在基类中重用代码.如:

class Callbacks {
  static void MyCallBack() { impl->MyCallBackImpl(); }
  ...

class CallbackImplBase {
   virtual void MyCallBackImpl() = 0;
Run Code Online (Sandbox Code Playgroud)

但是我尝试解决这个问题(Singleton,让回调包含在实现者类中,等等).我最终陷入了死胡同(impl通常最终指向基类,而不是派生类).

我想知道它是否完全可能,或者我是否坚持创建某种辅助函数而不是使用继承?

c++ design-patterns callback

3
推荐指数
1
解决办法
3026
查看次数

pcap_loop中的回调方法

我正在尝试使用 Linux 中 libpcab 库中的 pcap_loop 函数与此原型:

\n\n
int pcap_loop(pcap_t *, int, pcap_handler, u_char *);\n
Run Code Online (Sandbox Code Playgroud)\n\n

pcap_pkthdr 是一个函数指针:

\n\n
typedef void (*pcap_handler)(u_char *, const struct pcap_pkthdr *, const u_char *);\n
Run Code Online (Sandbox Code Playgroud)\n\n

在我的程序中,我在 SniffEthernet 类中定义了以下方法:

\n\n
void SniffEthernet::got_packet(u_char *args, const struct pcap_pkthdr *header, const u_char *packet);\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在调用 pcap_loop 如下

\n\n
pcap_loop(handle, num_packets, this->got_packet, NULL);\n
Run Code Online (Sandbox Code Playgroud)\n\n

给我以下编译时错误:

\n\n
SniffEthernet.cc:139:58: error: cannot convert \xe2\x80\x98VENTOS::SniffEthernet::got_packet\xe2\x80\x99 from type \xe2\x80\x98void (VENTOS::SniffEthernet::)(u_char*, const pcap_pkthdr*, const u_char*) {aka void (VENTOS::SniffEthernet::)(unsigned char*, const pcap_pkthdr*, const unsigned char*)}\xe2\x80\x99 to …
Run Code Online (Sandbox Code Playgroud)

c++ function-pointers

3
推荐指数
1
解决办法
3147
查看次数

标签 统计

c++ ×3

callback ×2

c ×1

design-patterns ×1

function-pointers ×1

interop ×1