2013-05-09 23 views
5

私はインターネットを検索し、非静的メンバー関数が静的メンバー関数または静的メンバー関数にアクセスできると言った人がいることが分かりました。それから、私はそれを確認するプログラムを書いた。非静的メンバー関数は静的メンバー関数またはデータにアクセスできますか?

#include <iostream> 
class test 
{ 
public: 
    static int a; 
    void printa() 
    { 
     std::cout<<a; 
    } 
}; 

int main(int argc, const char * argv[]) 
{ 
    test m; 
    m.printa(); 

    return 0; 
} 

このコードはリンカのエラーを生成します。クラス内部staticなどの変数の宣言は

Undefined symbols for architecture x86_64: 
    "test::a", referenced from: 
     test::printa() in main.o 
+0

が重複する可能性をのhttp://のstackoverflow。コム/質問/ 8612206 /リンカ・エラー時に、使用して静的メンバー) – AnT

+0

ここで同様の問題とその解決策は です[ここ] [1] [1]:のhttp:// stackoverflowの.com/questions/8034568/undefined-symbols-for-architecture-x86-64-which-architecture-should-i-use – Uahmed

+0

の可能な複製[プライベート静的メンバーの初期化](http://stackoverflow.com/questions/185844)/initializing-private-static-members) –

答えて

7

よく、のみ宣言です。あなたがに必要

は、単一のコンパイル単位にこの行を追加することを意味し、同様変数を定義します。

int test::a = 0;

をより正確にするには、次のコンパイル単位は、基本的には.cppファイルです。 でなければ、その行をヘッダファイルに直接入れる必要があります。そうしないと、反対のエラー "multiple definition of ..."が発生します。

これは、あなたが推測したように、プログラムが開始されると、変数を0に初期化します。

この行をクラス宣言の下に置くと、問題が解決します(この特定の状況では、これをヘッダーファイルに書き込まないでください)。

+2

は、「コンパイル単位」が何を意味するのかを誰もが知っているわけではないので、「ヘッダファイルに入れないでください」という価値があります。 – Elazar

+1

良い点。私はそれを私の答えに加えます。 – Nbr44

0

静的データメンバーインスタンスを定義する必要があります。 class testと同じ名前空間のスコープ内とclass testの定義の後、基本的にはどこにでも直接... ...

main()上記
int test::a; 

...、またはmain()下の行を追加します。あなたはそれを定義していない、test::aだけ宣言したためだ

+0

どこに定義するかは関係ありません。 – Elazar

+0

@Elazar:これは循環的な議論です。あなたが違法な場所に置くとそれが定義されないので、-Pです。上記の 'main'の私の提案は' main() '(これは別の宣言を構成する)内でも' class test 'の前でも 'inside'内でも*試行されていないことを保証することでした.... –

+0

@elazar that not完全に真実。そのクラスの宣言は可視である必要があります。 – jrok

2

#include <iostream> 
class test 
{ 
    ... 
}; 

int test::a = 1; //Needs a definition! 
1

あなただけstaticデータメンバを宣言しました。あなたはそれを定義していません。

あなたはそれを定義するためにint test:: a;のような何かをする必要があります。

非静的メンバは、静的データメンバにアクセスすることを許可されているthisを参照してください。静的メンバーがどのオブジェクトにも属していないため、逆は許可されません。

1

静的メンバーをクラスに作成する場合、クラス外で定義する必要があります。あなたはそれを定義するのを忘れました、それがリンカエラーを持っている理由です。

class Animal 
{ 
    static int leg; 
    int Data; 
    public: 
     int Display(); 

}; 

int Animal::leg=20; // Need to define the static member 

int Animal::Display() 
    { 
     cout<<"A static value :"<<leg<<endl; 
     leg =40; 
     cout<<"A static value :"<<leg<<endl; 
    } 


int main(int argc, char** argv) 
{ 
Animal a; 
a.Display(); 
return 0; 
} 

詳細については、このブログを参照:[静的メンバを使用するときにリンカエラー](の
http://www.aticleworld.com/

関連する問題