知识点涉及:模版、友元、线程安全。
思想:先思考如何规避问题,在考虑如何解决问题。
#include <iostream>
#include <string>
using namespace std;
template<typename T>
class Singleton
{
public:
static T* instance() {
if (nullptr == m_singleton) {
m_singleton = new T();
}
return m_singleton;
}
private:
Singleton() {}
Singleton(const Singleton<T> &){}
~Singleton() {}
Singleton<T>& operator = (const Singleton<T> &){}
private:
static T* m_singleton;
};
//模版成员变量的初始化
template<typename T> T* Singleton<T>::m_singleton = nullptr;
class A
{
public:
//由于构造函数声明为了私有,其他类声明友元来对私有进行访问
friend class Singleton<A>;
void show() {
cout << aa << endl;
}
private:
A() : aa("ss") {}
A(const A &){}
~A(){}
A& operator = (const A&){}
private:
string aa;
static A* m_A_;
};
A* A::m_A_ = nullptr;
int main()
{
Singleton<A>::instance()->show();
//多线程,线程安全问题:主线程创建,子线程调用
//主线程
Singleton<A>::instance();
//子线程
Singleton<A>::instance()->show();
}