0

コードは次のとおりです。

#include <iostream>

using namespace std;

class A {
    static int id_;

public:
    static void setId(int id) {
        id_ = id;
    }
    static int getId() {
        return id_;
    }
};

int main()
{
    A::setId(10);
    cout << A::getId() << endl;
    return 0;
}

XcodeMac OSでコンパイルすると、次のエラー メッセージが表示されます。

Undefined symbols for architecture x86_64:
  "A::id_", referenced from:
      A::setId(int) in main.o
      A::getId() in main.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

次の行を追加すると:

int A::id_ = 10;

の前にmain()。その後、すべてが順調です。その理由は何ですか?

4

2 に答える 2

3

変数は宣言および定義する必要があり、ドラフト C++ 標準セクションの9.4.2 静的データ メンバーには次のように記載されています。

クラス定義での静的データ メンバーの宣言は、定義ではありません [...]

したがって、定義する必要があります。そのため、次を追加する必要があります。

int A::id_ = 10;

これをより明確に見るために、次のことがわかります。

int A::id_ ;

で十分です。定義するA::id_だけで初期化する必要はありません。

この前のスレッドもお読みください:定義と宣言の違いは何ですか? .

Steve が指摘するように、ヘッダーファイルの使用に移行するときは、複数の定義が必要ないため、cpp ファイルで変数を定義する必要があります。

于 2013-11-01T19:32:21.280 に答える
2

クラス オブジェクトが作成されると、特定のコンパイラでは、初期化せずに静的変数を作成することはできません。

于 2013-11-01T19:29:16.203 に答える