1. 程式人生 > >CLion和C++類內靜態成員定義問題

CLion和C++類內靜態成員定義問題

有一段時間沒有用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檔案中都定義了這個指標我認為。

歡迎指正