2010-11-30 17 views
3

私のクラスの関数へのプライベート静的ポインタを持っていたいと思います。基本的には、次のようになります。関数へのC++静的ポインタ

//file.h 
class X { 
private: 
    static int (*staticFunc)(const X&); 
    ... 
public: 
    void f(); 

}; 


//file.cpp 
void X::f() 
{ 
    staticFunc(*this); 
} 

これは私に「解決されていない外部記号」エラーを与えます。

int (X::*staticFunc)(const X&) = NULL; 

をしかし、これは私に、「機能の初期化」エラーを与える:私は、静的メンバーがあまりにも.cppファイルに初期化されなければならないことを知って、私はこれを試してみました。私はそれを既存の関数で初期化しようとすると、醜いエラーが出る。 "= NULL"を指定しないと、同じエラーが発生します。

ありがとうございました。

+0

.cppファイルで 'staticFunc = NULL;'を試しましたか? (注:.cppファイルの型を再宣言しなければならないかどうかは分かりません) –

+0

申し訳ありませんが、実行時にコードを書きました。私はそれを修正しました。もちろん、staticFuncにパラメータを渡していました。そして私は実際に "int(* X :: staticFunc)(const X&)"の代わりに.cppファイル "int(X :: * staticFunc)(const X&)"を書いていました。あなたの答えをありがとう、それは愚かな間違いでした。 – stonecup64

答えて

4
//file.cpp 
int (*X::staticFunc)(const X&); 

void X::f() 
{ 
staticFunc(*this); 
} 
+0

クラス内の静的なデータメンバ宣言は*ただ*宣言であり、クラスの外に別の*定義*が必要です(正確に1翻訳単位(ソースコードファイル))。 –

+0

初期化子 '= NULL'または' =&someFunc'を 'X :: staticFunc'定義に追加することができます。初期化したい静的メンバの名前は 'X :: staticFunc'です。そのように修飾する必要があります。 'X ::'がなければ、C++はあなたが別の宣言を作成していると思っていました。 – aschepler

+0

'= NULL'は冗長です。これは保証されています。 – TonyK

2

そうでない場合は、あなただけのX.

の静的メンバに関連していない staticFuncと呼ばれるグローバル変数を作成したいことは、Xのメンバーですので、あなたは

int (*X::staticFunc)(const X&) = NULL; 

を言う必要があります

0

ここにいくつかの問題があります。

最初のエラーは、staticFuncを使用しようとしてパラメータを渡していないことです。これにより、報告していないコンパイラエラーが発生するはずです。

第2の問題は、構文が間違っていることです。 TonyKはそれを手に入れました。

関連する問題