2012-03-09 7 views
0

次のコードは問題なくコンパイルされます。リンクに行くときには、次のコードは正常にコンパイルされますが、静的使用時にリンクのエラーが表示される

はそれが

Undefined symbols for architecture x86_64: 
    "derived::counter", referenced from: 
    derived::getAddressCounter()  in main.cpp.o 
    ld: symbol(s) not found for architecture x86_64 
collect2: ld returned 1 exit status 

私は静的に何か問題があると疑われるエラー

を以下に示します。理由は分かりません。一度静的なコードを取り出すと、コードは正常にリンクします。しかし、このコードでスタティックはどのように役割を果たすのでしょうか?

#include <iostream> 
#include <string> 

struct base_result { }; 
struct result : public base_result { 
    int a; 
    std::string b; 
}; 


struct base { 
    static base_result counter; 

}; 

struct derived: public base { 
    static result counter; 

    result * getAddressCounter(){ 
     counter.a = 10; 
     counter.b = "haha"; 
     return &counter; 
    } 
}; 

int main(){ 
    derived d; 
    result * ptr; 

    ptr = d.getAddressCounter(); 

    ptr->a = 20; 
    ptr->b = "baba"; 
    std::cout << ptr->a << std::endl; 

    std::cout << ptr->b << std::endl; 
    return 0; 
} 

答えて

3
struct base 
{ 
    static base_result counter; 
}; 

のみ静的メンバを宣言し、また、一度あなたのcppファイル内にそれを定義する必要があります。

グッド読む:すべての作成したオブジェクト内の予約領域を取得するメンバ変数とは対照的に What is the difference between a definition and a declaration?

+0

よろしくお願い致します。 –

+0

静的変数なら、インスタンス変数の通常の定義は宣言になりますか? –

+0

nevermind私はそれを得た –

1

、静的変数は、ちょうど彼らががあまりにもに定義/実装する必要があり、宣言することはできません。

はちょうどあなたのコードに行

base_result base::counter; 
result derived::counter; 

を追加し、それがうまくコンパイルされます。これらの行は、以前宣言した静的変数を格納する領域を実際に確保するようにコンパイラに指示します。

+0

私は2つの答えを選択することができたらいい –

関連する問題