Version6:
#include <iostream>
using namespace std;
template<class T>
class Singleton
{
private:
public:
static T& GetInstance()//唯一对外开放的接口
{
static T instance;//C++11已经加锁,可以通过汇编看出来guard
return instance;
}
protected://保护类型,因为子类继承的时候要调用父类构造函数,写成public肯定不行,写成private子类就无法访问,就需要写friend class Manager了,写成protected,子类可以访问到Singleton构造函数,就不需要友元了
Singleton(){ cout << "Singeton" << endl; }
virtual ~Singleton(){ cout << "~Singeton" << endl; }
Singleton &operator=(const Singleton&){}
};
class Manager :public Singleton < Manager >
{
public:
friend class Singleton<Manager>;//Singleton作为子类的友员,Singleton就可以在GetInstance中访问子类的protected的方法了。
void SendTask(){}
void Meeting(){}
protected:
Manager(){ cout << "Manager" << endl; }
~Manager(){ cout << "~Manager" << endl; }
Manager&operator=(const Manager &){}
};
int main()
{
Manager& pInstance = Manager::GetInstance();
pInstance.SendTask();
pInstance.Meeting();
}