类中的c++回调语法

标签 c++ windows syntax callback

我正在尝试找出使用此第 3 方软件注册回调的语法。我认为这可能是一个基本问题,我只是不太熟悉 c++。他们有一个注册回调函数的方法,这样他们的代码就可以在事件发生时调用我代码中的函数。他们提供了一个从主文件注册回调的工作示例,但我想知道在类中工作时如何做到这一点

他们的方法签名:

smHTRegisterHeadPoseCallback(smEngineHandle engine_handle, void *user_data, smHTHeadPoseCallback callback_fun);

主文件中的工作示例:

void STDCALL receiveHeadPose(void *,smEngineHeadPoseData head_pose, smCameraVideoFrame video_frame)
{
 ...
}

void main()
{
 ...
 smHTRegisterHeadPoseCallback(engine_handle,0,receiveHeadPose)
 ...
}

但我想在我的类里面使用它

我的类.h

class FaceEngine
{
public:
 void STDCALL receiveFaceData(void *, smEngineFaceData face_data, smCameraVideoFrame video_frame);
    ...

我的类.cpp

void FaceEngine::Start(void)
{
 rc = smHTRegisterFaceDataCallback(hFaceAPIEngine,0,&FaceEngine::receiveFaceData);
        ...

此编译器错误的结果:

Error 1 error C2664: 'smHTRegisterFaceDataCallback' : cannot convert parameter 3 from 'void (__stdcall FaceEngine::* )(void *,smEngineFaceData,smCameraVideoFrame)' to 'smHTFaceDataCallback' d:\stuff\programming\visual studio 2008\projects\tut02_vertices\faceengine.cpp 43 Beard

如果我的问题不清楚,请告诉我如何澄清。

最佳答案

要将类成员用作函数指针参数,您必须将其声明为static 方法。如果你仔细想想,你就会明白为什么。普通类方法在被调用时会被无形地传递一个指向实例的指针(this 指针)。回调机制无法知道您希望调用其成员方法的类实例的地址。因此,不幸的是,您确实失去了在回调安排中自动访问实例数据的能力。

关于类中的c++回调语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3058481/

相关文章:

c++ - pretty-print 类型和类模板及其所有模板参数

c++ - 为什么函数允许使用变量名和数据类型名,而不能使用关键字?

scala - 为什么在scala中的代码块之前给出类名?

windows - 如何创建可视化 SVN 存储库并获取该 URL

syntax - ABAP 中的反引号和单引号

c++ - 不存在默认构造函数

c++ - 我应该在游戏中使用引用还是按值传递常用数组 [C++]

c++ - 使用 vc2010 和 msbuild 的多个构建规则

windows - 调用 TaskDialogIndirect 加载程序说找不到序号 345

python-3.x - 用 MinGW 或其他 C++ 编译器模仿 Visual C++(对于基于 Visual C++ 的 Python 包)?