通过实现单例模版类,使得子类继承模板类后,子类成为单例类
模板类
#pragma once
#include<memory>
#include<iostream>
// 单例模式模板类
template<class T>
class singleton {
private:
// 删除拷贝构造函数和拷贝赋值运算符重载
singleton(const singleton<T>& sig) = delete;
singleton& operator=(const singleton<T>& sig) = delete;
// 静态成员变量,存储单例对象指针
static std::shared_ptr<T> shared_T_ptr;
protected:
// 默认构造函数
singleton() = default;
public:
// 获取单例对象的静态方法
static std::shared_ptr<T> getInstance()
{
static std::once_flag flag;
// 只调用一次lambda表达式,初始化单例对象指针
std::call_once(flag, [&]() {
shared_T_ptr = std::make_shared<T>();
});
return shared_T_ptr;
}
// 析构函数
~singleton()
{
std::cout << "Destructor called for singleton<T>" << std::endl;
}
};
// 静态成员变量初始化
template<class T>
std::shared_ptr<T> singleton<T>::shared_T_ptr = nullptr;
子类继承和使用
#include <iostream>
#include<memory>
#include"singleton.h"
class myClass :public singleton<myClass>
{
private:
int a = 0;
public:
void setA(int x) { a = x; }
int getA() { return a; }
~myClass() { std::cout << "Destructor called\n"; }
};
int main()
{
std::shared_ptr<myClass> myObj= myClass::getInstance();
myObj->setA(10);
std::cout << "a = " << myObj->getA() << " " << myObj.get() << std::endl;
}