C++单列模式的基类模板

头文件

#include <mutex>

单列模板基类

template<typename T>
class singleton_base
{
public:
    static T *instance()
    {
        if(nullptr != _instance)
        {
            return _instance;
        }

        std::lock_guard<std::mutex> ll(_mutex);
        if(nullptr == _instance)
        {
            _instance = new(std::nothrow) T();
        }

        return _instance;
    }

protected:
    //使继承者无法public构造函数和析构函数
    singleton_base(){}
    virtual ~singleton_base(){}
private:
    //禁止拷贝构造和赋值运算符
    singleton_base(const singleton_base& src){}
    singleton_base &operator=(const singleton_base& src){}

    //它的唯一工作就是在析构函数中析构Singleton的实例,所以private
    class Garbo
    {
    public:
        ~Garbo()
        {
            if (singleton_base::_instance)
            {
                delete singleton_base::_instance;
                singleton_base::_instance = nullptr;
            }
        }
    };
    //定义一个静态成员变量,程序结束时,系统会自动调用它的析构函数,我们不需要访问这个变量,所以不需要初始化
    static Garbo garbo;

    static T *_instance;
    static std::mutex _mutex;
};

template<typename T>
T *singleton_base<T>::_instance = nullptr;

template<typename T>
std::mutex singleton_base<T>::_mutex;

测试:

int main()
{

    my_singleton::instance()->show();
    std::cout << my_singleton::instance() <<std::endl;
    my_singleton::instance()->show();
    std::cout << my_singleton::instance() <<std::endl;

return 0;

}

结果

get_id: 
0x607040
get_id: 
0x607040

猜你喜欢

转载自blog.csdn.net/f110300641/article/details/82378932