2012-01-19 13 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

あなたはstaticとしてCreateFnを定義していますか? –

答えて

2

ここに2つの問題があります。

まず、メンバー関数がthisポインターを操作する必要があるため、関数ポインターはメンバー関数を指すことができません。メンバー関数staticを作成するか、ポインターをメンバー関数ポインターにする必要があります。

第2に、関数ポインタと関数は同じ呼び出し規約を使用する必要があります。ポインタはCALLBACKを使用します。これは__stdcallに定義されています。ここで

は、改訂された機能です:

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

回答者のためにありがとう。超早い! – Innovare

0

メンバー関数(クラスのフィールドである関数)ではなくプレーン関数を渡す必要があります。それらは別個のオブジェクトであり、実際には、メソッドに隠された追加の引数があります。これは明らかにthis(メソッドが呼び出されているオブジェクト)へのポインタです。いずれにしても、コールバック定義をクラスに囲みたい場合は、静的メソッドにしてください。

0

メンバー関数は、渡されていないオブジェクトを呼び出す必要がありますが、必要なのは通常の関数です。

代わりにクラスに静的メソッドを使用します。オブジェクトポインタを渡す必要はありません。