2011-08-16 25 views
10

私は関数を別の関数にパラメータとして渡そうとしていますが、どちらも同じクラスのメンバ関数です。C++:メンバ関数での関数ポインタの使用

私は奇妙なエラーが発生しており、問題の原因を特定できません。ここで

は私の関数です:

void myClass::functionToPass() 
{ 
    // does something 
} 

void myClass::function1(void (*passedFunction)()) 
{ 
    (*passedFunction)(); 
} 

void myClass::function2() 
{ 
    function1(&myClass::functionToPass); 
} 

はしかし、私は次のエラーを取得しています:

cannot convert parameter 1 from 'void(__thiscall myClass::*) (void)' 
    to 'void(__cdecl*)(void)' 

だから何が与えますか?私はこれを動作させるためにあらゆるバリエーションを試したような気がします。メンバ関数の関数ポインタを渡すこともできますか?これをどのように機能させることができますか?

注:functionToPassを静的にすることは、実際には有効なオプションではありません。

+0

エラーメッセージには、問題を解決するために必要な情報がすべて記載されています。 –

+0

'boost :: function'の使用は、関数ポインタを使うより簡単です。 'boost :: function '(この場合は 'function1')と' boost :: function 'のどちらかをチェックする必要があります。 '* this'を渡す必要があります) – MSalters

答えて

11

メンバー関数に関数ポインタを渡すことができます。しかし、それはあなたのコードがやっていることではありません。あなたは通常の関数ポインタ(void (*passedFunction)()は通常の関数ポインタです)とメンバ関数へのポインタ(&myClass::functionToPassはメンバ関数へのポインタです)の間で混乱しています。彼らは同じものではなく、互換性がありません。

あなたはこの

void myClass::function1(void (myClass::*passedFunction)()) 
{ 
    (this->*passedFunction)(); 
} 

のようにコードを書き換えることができます今、あなたのコードは、メンバ関数へのポインタを使用しているが、もちろん、これはあなたが通常の関数ポインタを渡すことができないことを意味します。

+0

意味があります!私は明日までこれを試してみる機会がありませんが、それがうまくいくなら私は間違いなく受け入れます。 –

+1

関数ポインタチュートリアル:http://www.newty.de/fpt/index.html(非常に便利) –

1

あなたの間違いは、渡される関数ポインタのタイプにあります。それはvoid (myClass::*passedFunction)()でなければなりません。

ここには、tutorialがC++のメンバー関数へのポインタを使用しています。

+0

" this "の動作のバリエーションを使用できますか? –

+0

申し訳ありませんが、私はあなたが同じクラスのメンバ関数に関数ポインタを渡していたという事実を忘れました。私はあなたが 'passedFunction'が指す関数を実際に呼び出すために' myClass'のオブジェクトが必要な場合、他の関数に渡していると思いました。 – Dima

関連する問題