1. 程式人生 > >C++之智慧指標和普通指標單例模式兩種實現

C++之智慧指標和普通指標單例模式兩種實現

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;