CLion和C++類內靜態成員定義問題
阿新 • • 發佈:2018-12-20
有一段時間沒有用C++了,今天寫了一個簡單的單例模式,然後CLion一直報錯,連結錯誤,用VS跑結果一樣,也不行
VS錯誤資訊:
CLion:
問題在於
Singleton.h
class Singleton
{
private:
Singleton();
static Singleton *p;
public:
static Singleton* getInstance();
};
Singleton* Singleton::p = nullptr;
這裡的p指標的初始化不能放在標頭檔案裡面初始化,必須放在對應的實現檔案裡面Singleton.cpp裡面來初始化,但是CLion在Singleton.cpp中編寫程式碼的時候如圖:
程式碼提示中並沒有p指標,很容易讓我們誤以為這裡面不能在cpp檔案中來初始化。
總而言之,你要不就只有一個Singleton.h檔案,然後裡面宣告和實現都寫好(這樣也是不會報錯的),如果有一個Singleton.cpp檔案來實現,就必須把幾乎所有(除開例如靜態常量的初始化、行內函數的實現等)的初始化或者實現都寫在.cpp檔案中,不能一部分實現放在.cpp中,一部分放在.h中,暫時的實驗的出來的是這樣的結論。
這邊報的連結錯誤,是.cpp檔案生成.obj檔案之後連結成可執行檔案的時候出現了多重定義,,如果你把
這一行程式碼放到.h中報的就是多重定義,如果你把這一行程式碼從.h中刪掉,.cpp中也不定義,出現的就是無法解析。
這裡的多重定義是Singleton.cpp生成的.obj檔案和main.cpp生成的obj檔案中都定義了這個指標我認為。
歡迎指正