2010-06-17 18 views
0

我想弄清楚這個第三方軟件註冊回調的語法。我認爲這可能是一個基本問題,我只是不太熟悉C++。他們有一個註冊回調函數的方法,以便他們的代碼可以在事件發生時在我的代碼中調用函數。他們提供的記錄來自主文件回調工作的例子,但我想知道怎麼做了一個類的內部工作時在一個類中的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) 
... 
} 

但我想用這個從我的類

MyClass.h

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

MyClass.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 

如果我的問題是不明確的,請讓我知道我可以澄清。

+1

「smHTFaceDataCallback」的聲明是什麼樣的? 錯誤消息是說你沒有正確地調用smHTRegisterFaceDataCallback ... – Cogwheel 2010-06-17 02:11:45

回答

0

你需要使用一個蹦牀功能的成員函數不能被稱爲沒有一個實例:

void STDCALL trampoline(void* data, smEngineHeadPoseData hp, smCameraVideoFrame vf) { 
    static_cast<FaceEngine*>(data)->receiveFaceData(hp, vf); 
} 

// ... register: 
smHTRegisterFaceDataCallback(hFaceAPIEngine, static_cast<void*>(this), &trampoline); 

注意,這裏使用的用戶數據參數傳遞this指針,所以蹦牀函數知道哪個實例調用成員函數。

+0

好吧,我明白了。這有點聰明。我以前沒有聽說過蹦牀的功能。感謝你的回答 – 2010-06-17 02:40:33

1

要使用類成員作爲函數指針參數,必須將其聲明爲static方法。如果你仔細想想,你會明白爲什麼。正常的類方法在被調用時會無形地傳遞一個指向實例的指針(this指針)。回調機制無法知道您希望調用其成員方法的類的實例的地址。所以,不幸的是,你確實失去了在回調安排中訪問實例數據的自動能力。

相關問題