2012-04-22 23 views
1

GTAODVという名前のクラスに静的メンバー配列を作成しました。C++の静的メンバー配列

gtaodv/gtaodv.o: In function `GTAODV::command(int, char const* const*)': 
gtaodv.cc:(.text+0xbe): undefined reference to `GTAODV::numdetections' 
gtaodv.cc:(.text+0xcc): undefined reference to `GTAODV::numdetections' 
gtaodv/gtaodv.o: In function `GTAODV::check_malicious(GTAODV_Neighbor*)': 
gtaodv.cc:(.text+0x326c): undefined reference to `GTAODV::numdetections' 
gtaodv.cc:(.text+0x3276): undefined reference to `GTAODV::numdetections' 
collect2: ld returned 1 exit status 

はなぜこれを行います:私は、クラスメソッド(以下の例)内

numdetections[nb->nb_addr]++; 
for(int i=0; i<MAXNODES; i++) if (numdetections[i] != 0) printf("Number of detections of %d = %d\n", i, numdetections[i]); 

をこの配列にアクセスしようとすると、

static int numdetections[MAXNODES]; 

しかし、リンカは、コンパイル時にエラーになります起こる?

+3

あなたのリンカーは 'numdetections'の定義を知らないので。この変数をどこで使用していますか?定義はどこですか? –

+0

GTAODVクラスでnumdetectionsを定義しました。私はGTOADVメンバ関数でそれを使用しています。 – vigs1990

+0

コードを投稿してください... –

答えて

10

このエラーが発生すると、静的メンバーを定義するのを忘れている可能性があります。あなたのクラス定義の中にこれを仮定すると:

class GTAODV { 
public: 
    static int numdetections[MAXNODES]; // static member deklaration 
    [...] 
}; 

ソースファイル内:

int GTAODV::numdetections[] = {0}; // static member definition 

クラスの宣言の外の定義に注意してください。

編集これは、「理由」に関する質問に答える必要があります。静的メンバーは、具体的なオブジェクトが存在しなくても存在できます。 e。 オブジェクトをGTAODVにインスタンス化せずにnumdetectionsを使用できます。この外部リンケージを有効にすることが可能でなければならないため、参照のために静的変数の定義が存在する必要があります。Static data members (C++ only)

+1

この定義をcppファイルに置く必要があります。その定義は一度だけ定義されます。 – zmccord

+0

はい、これがエラーの原因です。なぜこれが起こるのか説明してください。私は、メモリが宣言されたときに静的メンバ配列に割り当てられていると思った。この方法で静的メンバー値を初期化しますが、静的メンバー配列を初期化する方法はわかりませんでした。 – vigs1990

+0

@zmccordヒントのおかげで、説明のために編集を加えました。 –

関連する問題