單例模式中靜態類成員變數初始化問題
阿新 • • 發佈:2018-12-26
最近做一個專案,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 資料成員的定義放在包含類非內聯成員函式定義的檔案中。
也就是說在定義靜態成員變數時,必須對其進行初始化,不管是內建型別還是類型別。如果沒有進行初始化,則在引用時,會提示未定義的引用錯誤。而如果只是定義,並不在任何地方引用,則不會出現編譯錯誤,但是變數不可用。
注:本例中使用到的單例模式程式碼並非最優,僅作程式碼參考,如果對單例模式有興趣的可以自行找其他資料學習。