1

重複の可能性:
静的メンバー変数へ
の未定義の参照 未定義の参照/未解決の外部シンボル エラーとは何ですか。

#include<iostream>
using namespace std;

class abc {

    private:
    static int a ;

    public:

    abc(int x) {
        a = x;
    }

    void showData() {
        cout<<"A = "<<a<<endl;
    }
};

int main() {
    abc a1(4);
    abc a2(5);

    a1.showData();
    a2.showData();

    return 0;
}

GCCコンパイラを使用してUbuntuでこの関数をコンパイルしようとすると。次のエラーが表示されます。

/tmp/ccCKK2YN.o: In function `main':
static1.cpp:(.text+0xb): undefined reference to `Something::s_nValue'
static1.cpp:(.text+0x14): undefined reference to `Something::s_nValue'
collect2: ld returned 1 exit status
Compilation failed.

次のコードは正常に実行されます

#include<iostream>
using namespace std;

class Something
{
public:
    static int s_nValue;
};

int Something::s_nValue = 1;

int main()
{
    Something cFirst;
    cFirst.s_nValue = 2;

    Something cSecond;
    std::cout << cSecond.s_nValue;

    return 0;
}

これは、オブジェクトを介してアクセスする前に、静的メンバー変数を明示的に初期化する必要があるためです。なぜですか?

4

3 に答える 3

1

static int s_nValue;int を格納するためのストレージを割り当てず、宣言するだけです。

変数を格納するためにメモリ内のどこかに割り当てます。

int Something::a=0;
于 2012-10-29T16:30:14.090 に答える
0

これは、静的メンバーがクラスのすべてのインスタンス間で共有されるため、1 つの場所で宣言する必要があるためです。

クラス宣言内で静的変数を定義するincludeと、そのファイルのそれぞれにその変数への定義が含まれます(これはstatic意味に反します)。

そのため、で静的メンバーを定義する必要があります.cpp

于 2012-10-29T16:31:19.690 に答える
0

クラスのメンバー リスト内の静的データ メンバーの宣言は、定義ではありません。名前空間スコープ内で、クラス宣言の外で静的メンバーを定義する必要があります。

このスレッドを参照してください。

つまり、静的メンバーはファイル内のどこかで初期化し.cppて、コンパイラがスペースを割り当てる必要があります。宣言は次のようになります。

int abc::a = 0;
于 2012-10-29T16:30:04.010 に答える