3

私は次のコードを使おうとしていました:

class Test 
{
private:
    static int x;
public:
    Test(int i) : x(i) {}
};
main()
{
    Test a(5);
}

しかし、その後、エラーが発生しました:

‘int Test::x’ is a static data member; it can only be initialized at its definition

上記の実装の何が問題になっていますか?

4

3 に答える 3

4

エラーメッセージは問題をかなり正確に伝えています。

問題は、たまたま作成したクラスのインスタンスの数に関係なく、静的メンバーにはインスタンスが 1 つしかないことです。クラスの複数のインスタンスを作成する場合でも、一度だけ初期化します。つまり、コンストラクターにアタッチすることはできません。

class Test 
{
private:
    static int x;
public:

};

int Test::x = 1; // newly added

main()
{
    Test a;
}

この場合、静的メンバー変数はまったく必要ないように見えますが、クラスのインスタンスを作成するときに初期化するために値を渡しています。メンバー変数:

class Test 
{
private:
    int x;
public:
    Test(int i) : x(i) {}
};

main()
{
    Test a(5);
}

この場合、別の値を持つオブジェクトの 2 番目のインスタンスが必要な場合は、次のようにすることができます。

main() { 
    Test a(5), b(1);
}
于 2013-03-20T04:17:15.797 に答える
3

静的変数はオブジェクトの一部ではなく、クラスの一部です。そのため、オブジェクトの他のメンバーと一緒に初期化することはできません。

ソースファイルのどこかに静的変数の定義を提供する必要があり、その初期化をそこに置くことができます:

int Test::x = 5;
于 2013-03-20T04:15:08.850 に答える
1

クラスの静的変数にはストレージが必要であり、クラス本体の外部で初期化することができます。このような:

class Test 
{
private:
    static int x;
public:
    Test(int i) { x = i; }
};
int Test::x = 42;

main()
{
    Test a(5);
}
于 2013-03-20T04:16:43.477 に答える