2012-01-19 219 views
2

我不是C++的人,我在理解如何將函數指針/回調函數傳遞給方法時遇到了一些麻煩。回調的定義如下C++函數指針和回調函數

typedef HRESULT (CALLBACK *PFN_CREATE_XAMLOBJECT)(
    IXRDependencyObject *pExistingXRDO, 
    UINT objectId 
); 

的方法,我試圖通過它也被定義爲如下(刪除了所有其他PARAMS)

virtual HRESULT STDMETHODCALLTYPE RegisterXamlObject(
    __in PFN_CREATE_XAMLOBJECT pfXamlObjectCreation, 
) = 0; 

我已經定義轉嫁如下功能

HRESULT CreateFn(__in IXRDependencyObject *pExistingXRDO, UINT objectId) 
{ 
    return S_OK; 
} 

我試圖按如下方式傳遞函數指針。

&MyClass::CreateFn 

我收到以下錯誤

Error 3 error C2440: 'type cast' : cannot convert from 'HRESULT (__cdecl MyClass::*)(IXRDependencyObject *,UINT)' to 'PFN_CREATE_XAMLOBJECT' 

任何幫助將非常感激。

+0

有你定義CreateFn爲靜態的? –

回答

2

這裏有兩個問題。

首先,函數指針不能指向成員函數,因爲成員函數需要this指針才能操作。您必須使成員函數static,或使指針成員函數指針。

二,函數指針和函數必須使用相同的調用約定。指針使用CALLBACK,其定義爲__stdcall

這裏是一個修改後的功能:

static HRESULT CALLBACK CreateFn(IXRDependencyObject *pExistingXRDO, 
           UINT objectId) 
{ 
    return S_OK; 
} 
+0

感謝您的回答。超級快! – Innovare

0

你必須傳遞一個普通函數,而不是一個成員函數(一個函數是一個類的字段)。它們是不同的對象,事實上,該方法需要一個隱藏的附加參數,這顯然是指向this(該方法被調用的對象)的指針。如果您想將回調定義放入類中,請將其設爲靜態方法。

0

一個成員函數需要一個你沒有經過的對象被調用,而你想要的是一個正常的函數。

改爲在您的類中使用靜態方法,而不需要將對象指針傳遞給它。