1. 程式人生 > >單例模式中靜態類成員變數初始化問題

單例模式中靜態類成員變數初始化問題

    最近做一個專案,C++語言,使用到了單例模式做設計。在具體編寫程式碼時,使用了靜態成員變數和靜態函式。程式碼如下:

class Camera
{
	private:
		//(省略若干程式碼)
		static Camera* pCamera ;
		//(省略若干程式碼)
	public:
	  //(省略若干程式碼)
		static Camera* getInstance()
		{
			if(pCamera==NULL)
				pCamera=new Camera();
			return	pCamera;
		}
	  //(省略若干程式碼)		
}

在編譯時,提示:

Client.o: In function `Camera::getInstance()':
/mnt/hgfs/mpp/sample/faceRecogn/Camera.h:77: undefined reference to `Camera::pCamera'
collect2: ld returned 1 exit status

    由於對C++類靜態成員變數初始化規則記憶模糊,然後這個程式碼形式在網上也到處搜尋的到,故一直在思考是不是由其它地方的語法錯誤引起的。後來,翻閱相關權威技術文件,最終明白了語法規則。以下內容摘自《C++ primer (第四版)》。

    static 資料成員必須在類定義體的外部定義(正好一次)。不像普通資料成員,static 成員不是通過類建構函式進行初始化,而是應該在定義時進行初始化。 保證物件正好定義一次的最好辦法,就是將 static 資料成員的定義放在包含類非內聯成員函式定義的檔案中。 

    也就是說在定義靜態成員變數時,必須對其進行初始化,不管是內建型別還是類型別。如果沒有進行初始化,則在引用時,會提示未定義的引用錯誤。而如果只是定義,並不在任何地方引用,則不會出現編譯錯誤,但是變數不可用。

    注:本例中使用到的單例模式程式碼並非最優,僅作程式碼參考,如果對單例模式有興趣的可以自行找其他資料學習。