C++などの内部静的メンバー


クラス静的メンバーはstaticキーワードで宣言され、クラス属性に属し、すべてのオブジェクトが共有されます.これを変更すると、静的メンバーはクラス内またはクラス外で初期化する必要があります.ここでは、静的クラスタイプメンバーが初期化されていない場合に発生する結果と、どのように修正するかを説明します.
コード:
#include <iostream>

using namespace std;

class X{
public:
	X():value(1){cout<<"X()       "<<endl;}
	X(const X &x){cout<<"X(const X &x)       "<<endl;}
	int value;
};

class Y{
public:
	Y(){};

	static X x;
};
//X Y::x=X();//       
int _tmain(int argc, _TCHAR* argv[])
{
	Y y;
	cout<<y.x.value<<endl;
	return 0;
}

結果はコンパイルエラー:
1>練習13.44_staticクラスメンバー_test.obj:error LNK 2001:解析不能外部符号「public:static class X Y::x」(?x@Y@@2 VX@@A)1>C:Usersdocumentsvisual studio 2012ProjectsC++primer第13章コピー、付与、破棄Debug練習13.44_staticクラスメンバー_test.Exce:fatal error LNK 1120:1個の解析不能外部コマンド
理由は簡単で,Yクラスの静的属性xは初期化されていないため,コンパイラはxというオブジェクトの具体的な属性を取得できない.
解決:
#include <iostream>

using namespace std;

class X{
public:
	X():value(1){cout<<"X()       "<<endl;}
	X(const X &x){cout<<"X(const X &x)       "<<endl;}
	int value;
};

class Y{
public:
	Y(){};

	static X x;
};
X Y::x=X();
int _tmain(int argc, _TCHAR* argv[])
{
	Y y;
	cout<<y.x.value<<endl;
	return 0;
}