zoukankan      html  css  js  c++  java
  • c++单例模式的写法

    c++单例模式

    class Singleton
    {
        publicstatic Singleton* GetInstance();
            ~Singleton();
        private:
            static Singleton* p_singleton;
            Singleton();
    }

    实现

    Singleton::Singleton() {
    };
    Singleton::~Singleton() {
    }
    Singleton* Singleton::GetInstance() {
        if(p_singleton == NULL) {
            p_singleton= new Singleton();
        }
    }
    Single::p_singleton =NULL;  //必要,类头文件中只是声明,并没有定义

    当然,考虑到异常安全,可以加上锁。

    Singleton::Singleton() {
    };
    Singleton::~Singleton() {
        if(p_singleton) {
          delete p_singleton;
         }
    }
    Singleton* Singleton::GetInstance() {
        Lock();
        if(p_singleton == NULL) {
            p_singleton= new Singleton();
        }
    }
    Single::p_singleton =NULL;  //必要,类头文件中只是声明,并没有定义

    这样无论是不是第一个创建实例都要Lock,效率太低

    Singleton::Singleton() {
    };
    Singleton::~Singleton() {
        if(p_singleton) {
          delete p_singleton;
         }
    }
    Singleton* Singleton::GetInstance() {
        if(p_singleton == NULL) {
            Lock();
            if(p_singleton == NULL) {
                 p_singleton= new Singleton();
            }
        }
    }
    Single::p_singleton =NULL;  //必要,类头文件中只是声明,并没有定义

    这样就好了。

    但是这样存在另一个问题,这个实例如何delete;

    可以在Singleton中自定义一个回收类,负责回收p_singleton

    class Singleton
    {
        publicstatic GetInstance();
            ~Singleton();
        private:
            class Garbo {
             public:
               ~Garbo() {
                  if(p_singleton) {
                      delete p_singleton;
                  }
               }
            }
            static Garbo garbo;
            static Singleton* p_singleton;
            Singleton();
    }

    程序结束会回收所有对象,包括gaobo,gaobo析构函数被调用,进而释放掉p_singleton;

    单例模式还可以这么实现。

    class Singleton {
    public:
        static Singleton& GetInstance() ;
    private:
        Singleton();
    }
    Singleton::Singleton() {
    }
    Singleton& GetInstance() {
       static Singleton MySingleton;
       return MySingleton;
    }

    当然,可以加锁。另外,编译器会自动添加copy构造函数和copy赋值函数,所以

    Singleton singleton1= Singleton::GetInstance();

    singleton不是GetInstance生成的sinleton,而是通过copy赋值函数构造出来的,这样就违反了单例的定义。

    为了解决这个问题,可以声明Singleton的copy构造函数和copy赋值函数为私有变量,并且不去实现他们

    class Singleton {
    public:
        static Singleton& GetInstance() ;
    private:
        Singleton(Singleton &rhs);
        Singleton& operator = (Singleton &rhs);
        Singleton();
    }

    这样就避免了赋值引起的问题

  • 相关阅读:
    JS之四舍五入有小数点
    c# table 怎么在前台循环展示 ViewBag
    c# ajax从后台获取数据list数组 $.each再显示数据
    c# 快捷键
    c#_导出table功能
    c# 缓存详解
    c# url链接转成二维码图片,再转成byte[]二进制流,输出到前段ajax
    JS ajax 返回的json对象 新增属性值(干货)
    tomcat配置HTTPS
    zookeeper集群安装
  • 原文地址:https://www.cnblogs.com/clark-lee/p/3900800.html
Copyright © 2011-2022 走看看