C++之智能指针和普通指针单例模式两种实现

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011068702/article/details/83834897

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;

猜你喜欢

转载自blog.csdn.net/u011068702/article/details/83834897