C++单例模式详解

发表于:2013-1-17 10:09

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:lmh12506    来源:51Testing软件测试网采编

  类CGarbo被定义为CSingleton的私有内嵌类,以防该类被在其他地方滥用。

  程序运行结束时,系统会调用CSingleton的静态成员Garbo的析构函数,该析构函数会删除单例的唯一实例。

  使用这种方法释放单例对象有以下特征:

  在单例类内部定义专有的嵌套类;

  在单例类内定义私有的专门用于释放的静态成员;

  利用程序在结束时析构全局变量的特性,选择最终的释放时机;

  使用单例的代码不需要任何操作,不必关心对象的释放。

  进一步的讨论

  但是添加一个类的静态对象,总是让人不太满意,所以有人用如下方法来重现实现单例和解决它相应的问题,代码如下:

class CSingleton
{
    //其他成员
    public:
        static Singleton &GetInstance()
{
    static Singleton instance;
    return instance;
}
        private:
            Singleton() {};
};

  使用局部静态变量,非常强大的方法,完全实现了单例的特性,而且代码量更少,也不用担心单例销毁的问题。

  但使用此种方法也会出现问题,当如下方法使用单例时问题来了,

  Singleton singleton = Singleton :: GetInstance();

  这么做就出现了一个类拷贝的问题,这就违背了单例的特性。产生这个问题原因在于:编译器会为类生成一个默认的构造函数,来支持类的拷贝。

  最后没有办法,我们要禁止类拷贝和类赋值,禁止程序员用这种方式来使用单例,当时领导的意思是GetInstance()函数返回一个指针而不是返回一个引用,函数的代码改为如下:

static Singleton *GetInstance()
{
static  Singleton instance;
return  &instance;
}

  但我总觉的不好,为什么不让编译器不这么干呢。这时我才想起可以显示的生命类拷贝的构造函数,和重载 = 操作符,新的单例类如下:

class Singleton
{
    //其他成员
    public:
        static Singleton &GetInstance()
{
    static Singleton instance;
    return instance;
}
        private:
            Singleton() {};
            Singleton(const Singleton);
            Singleton & operate = (const Singleton&);
};

  关于Singleton(const Singleton); 和 Singleton & operate = (const Singleton&); 函数,需要声明成私用的,并且只声明不实现。这样,如果用上面的方式来使用单例时,不管是在友元类中还是其他的,编译器都是报错。

  不知道这样的单例类是否还会有问题,但在程序中这样子使用已经基本没有问题了。

32/3<123>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号