2012-04-24 23 views
1

コールバックを関数ポインタに転送したいと思います。C++静的関数ポインタを呼び出す

public: 
    int RegisterCallback1(int (*fct)); 
private: 
    static int (*m_Callback1); 

class1.cpp中:

int class1::RegisterCallback1(int (*fct)) 
{ 
    m_Callback1= fct; 
} 
だから私は、静的な(int型*)m_pointer1、同様の方法、ボイドRegisterCallback1((int型*)FCT)class1.hで

を宣言します

そして、私は、関数ポインタへのコールバックを転送したい:

void class1::Callback1() 
{ 
    (*m_Callback1)(); 
} 

しかし、私は、「Expressionが必要コンパイラエラーを取得しますhave(pointer-to) - 関数型 私はチュートリアルに従って関数ポインタについて読んだことがあり、問題なくこのようにしているようです。なぜどんなアイデア?

EDIT: だから、私は(int型*)(無効)m_Callback1 - ビジュアルメーカーがあり、ボイドが必要です...- 宣言する次に、どのように私は、引数でregisterCallback関数を呼び出すのですか?

class1.RegisterCallBack1( ??? - class2::callback -???); 

答えて

6

あなたは関数ポインタを宣言しておらず、通常のデータポインタを宣言しています。あなたは宣言の最後に行方不明です()。

+0

すごく面白いですが、registerCallback1関数を引数で呼び出すにはどうすればよいですか? class1.RegisterCallBack1(??? - class2 :: callback - ???); –

+0

@David: 'class2 :: callback'が' static'、 'c1.RegisterCallBack1(&class2 :: callback)'であると仮定します。 – ildjarn

+0

これは別のエラーを出します:void(__ stdcall *)()型の引数はvoid型(*)()のパラメータと互換性がありません。 __stdcallを関数ポインタの減速に追加すると、m_callback1()がclass1(class2ではなく)に見つかりませんというリンクエラーが発生します。 –

7

static int (*m_Callback1)は、関数ポインタを宣言しません。intへのポインタです。パラメータリストは忘れています。あなたは意味:あなたが欠落している()エラーを制限しようとすることができます

static int (*m_Callback1)(); 

int RegisterCallback1(int (*fct)()); 
+0

すごくいいですが、RegisterCallback1にどのように渡すのですか?私はclass1.RegisterCallback1(int *)class2 :: callbackのようなものを試しました。と多くの組み合わせ、それらはすべて私にエラーを与えるようですか? int型の引数を持つものは常に*(int *)()と互換性がありません。 –

1

は、コールバック関数の署名のためのtypedefを使ってオリとDaveが指摘:typedef int (*)() CallBack;これは、少なくとも必要がありますそのような関数を使用するコードのあらゆる点ではなく、正確な数のブラケットについて考えることができます。

関連する問題