来自C++的终级老单例

    一个可继承的单例模式。

这是可被继承的基类

 



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,同时把父类声明为友元类,这样,父类可以创建子类,而其他人则不行。

 

    我心中较完美的一种。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值