一个可继承的单例模式。
这是可被继承的基类
template<typename T>
class Singleton
{
public:
Singleton(const Singleton&) = delete;
virtual ~Singleton(){}
Singleton &operator=(const Singleton&) = delete;
protected:
Singleton(){}
public:
static T* instance()
{
return t;
}
private:
static T *t;
};
template<typename T>
T* Singleton<T>::t = new T();
这是测试用例
#include<iostream>
#include"Singleton.h"
class A : public Singleton<A>
{
friend class Singleton<A>;
public:
void output()
{
std::cout << "hello" << std::endl;
}
protected:
A(){}
};
int main()
{
//A a;
//a.output();
A::instance()->output();
return 0;
}
之前看设计模式书上没有这个用法,最近做项目看到了,打开了新世界的大门。这个模板基类,很有想法。 这也是模板编程的魅力。不用模板编程,基本写不出这种父类——想想看,父类要有static virtual instance函数,才能同时达到可instance函数可被通过类访问且可被继承。但现实中static virtual函数是不能通过编译的,
有几点要注意的。
第一, = delete是C++11中新加的用法,如果是老版本的C++,请把赋值构造函数和赋值运算符的重载函数定义为private,效果一样。
第二,要把子类的构造函数声明为protected,同时把父类声明为友元类,这样,父类可以创建子类,而其他人则不行。
我心中较完美的一种。