我正在尝试找出使用此第 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/