成员函数指针和回调

时间:2011-06-03 09:59:14

标签: c++ function pointers callback member

您好 我试图传递一个成员函数回调。我知道函数指针和成员函数指针是不同的,并试图创建一个包装器并使用静态转换和void指针。不幸的是我错过了一些东西,因为我的代码在编译时产生错误

Error   16  error C2664: 'dSpaceCollide' : cannot convert parameter 3 from 'int (__cdecl *)(void *,void *,dGeomID,dGeomID)' to 'dNearCallback (__cdecl *)'  

我的代码.....

class ODEPhysics

头文件

void NearCallback (void* data, dGeomID o1, dGeomID o2);
static int StaticNearCallback(void* data, void* userPtr, dGeomID o1, dGeomID o2);

.cpp file
void ODEPhysics::NearCallback (void* data, dGeomID o1, dGeomID o2){.........}

void ODEPhysics::StaticNearCallback(void* data , void* userPtr, dGeomID o1, dGeomID o2)
{
      static_cast<ODEPhysics*>(userPtr)->NearCallback( data, o1,  o2);


}

dSpaceCollide (Space, 0, &ODEPhysics::StaticNearCallback); 

如果有人能够澄清我做错了什么以及为什么会非常感激。

佛瑞德

3 个答案:

答案 0 :(得分:1)

问题最有可能来自您所展示的dSpaceCollide只想要一个

typedef void (*dNearCallback)(void*,dGeomID,dGeomID)

回调,即具有单个void*用户数据指针和两个dGeomID s作为参数的函数。 void*是您传递给dSpaceCollide的任何数据。

假设dSpaceCollide定义如下:

void dSpaceCollide(CSpace s, void* user_data, dNearCallback cb){
  // somewhere inside the code it will call your callback:
  cb(user_data, some_other, params);
  // ...
}

然后您可以将回调更改为:

void NearCallback(dGeomID o1, dGeomID o2);
static void StaticNearCallback(void* data, dGeomID o1, dGeomID o2){
  ODEPhysics* self = static_cast<ODEPhysics*>(data);
  self->NearCallback(o1, o2);
}

不再需要成员函数中的void* data指针,因为data仅与静态回调相关:

// assuming you call this inside of your ODEPhysics class
dSpaceCollide(Space, this, &ODEPhysics::StaticNearCallback);
// pass this as user_data

答案 1 :(得分:0)

我将在这里猜测,并假设typedef void dNearCallback(void *data, dGeomID o1, dGeomID o2)。也就是说,没有void* userPtr传递给你的回调。当您尝试使用{em> 期望StaticNearCallback的{​​{1}}时,类型系统会捕获此信息。

这个问题的根源可能是一个更根本的误解。为什么您的void* userPtr两个无类型StaticNearCallback指针?您在void*中使用void* data做了什么?请记住,C ++方法有一个(类型化的)NearCallback指针,所以你很少需要一个无类型的this

答案 2 :(得分:0)

查看boost::function(也许boost::bind)。它们通常可以让您的生活更轻松。