C++之智慧指標和普通指標單例模式兩種實現
阿新 • • 發佈:2018-11-09
1 問題
實現c++的單例模式,這裡測試分別寫了通過智慧指標返回物件和普通返回指標
2 程式碼測試
include <iostream> #include <mutex> #include <memory> using namespace std; class Single { public: static Single& getInstance() { std::mutex mt; if (instance.get() == NULL) { mt.lock(); if (instance.get() == NULL) { instance.reset(new Single()); } mt.unlock(); } return *instance; } private: Single(){} ~Single(){} static std::auto_ptr<Single> instance; friend class std::auto_ptr<Single>; Single(const Single&); Single& operator= (const Single&); }; std::auto_ptr<Single> Single::instance; class Single1 { public: static Single1* getInstance() { mutex mt; if (instance == NULL) { mt.lock(); if (instance == NULL) { instance = new Single1(); } mt.unlock(); } return instance; } private: static Single1 *instance; Single1() {} ~Single1() {} Single1(const Single1&); Single1& operator= (const Single1&); }; Single1* Single1::instance = NULL; int main() { Single &s = Single::getInstance(); Single1 *s1 = Single1::getInstance(); return 0; }
3 總結
在寫C++類的靜態變數的時候,一定要單獨拿出來初始化,這點和java有點不一樣,切記,以後千萬不能忘記,如果C++的靜態變數直接在類裡面
private:
static Single1 *instance = NULL;
初始化的編譯提示錯誤如下,這裡和java不同,Java的話靜態變數直接在類裡面初始化沒毛病
non-const static data member must be initialized out of line
所以我們一定要記得C++靜態變數的初始化
std::auto_ptr<Single> Single::instance;
Single1* Single1::instance = NULL;