欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 社会 > c++单例模式

c++单例模式

2024/12/26 20:31:34 来源:https://blog.csdn.net/EmLinuxDeveloper/article/details/140077187  浏览:    关键词:c++单例模式

1)C++入门级小知识,分享给将要学习或者正在学习C++开发的同学。

2)内容属于原创,若转载,请说明出处。

3)提供相关问题有偿答疑和支持。

单例模式也称为单件模式、单子模式,可能是使用最广泛的设计模式。其意图是保证一个类仅有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。有很多地方需要这样的功能模块,如系统的日志输出,GUI应用必须是单鼠标,MODEM的联接需要一条且只需要一条电话线,操作系统只能有一个窗口管理器,一台PC连一个键盘。
另外需要注意一个问题是:
在c++中不允许在类中定义自身类的对象,但是允许类中定义自身类的指针以及引用:

以上原因在于定义一个指针类型仅仅是占用4字节,在类中仅仅是占个位置,并且要是用指针a的话需要为其分配空间,在分配空间的时候会真正的实例化;
 

如下是单例模式的基础模型:
class CSingleton
{
private:
CSingleton() //构造函数是私有的
{
}
static CSingleton *m_pInstance;
public:
static CSingleton * GetInstance()
{
if(m_pInstance == NULL) //判断是否第一次调用
m_pInstance = new CSingleton();
return m_pInstance;
}
};


用户访问唯一实例的方法只有GetInstance()成员函数。如果不通过这个函数,任何创建实例的尝试都将失败,因为类的构造函数是私有的。
GetInstance()使用懒惰初始化,也就是说它的返回值是当这个函数首次被访问时被创建的。这是一种防弹设计——所有GetInstance()之后的调用都返回相同实例的指针;
如下:当释放的时候会出现double释放的异常,说明不管创建多少实例都只能拿到一个相同的实例:

懒汉模式:
实例1(拷贝构造创建对象)


实例2:(只能通过引用来访问对象实例)

有一种情况是,假如有两个人都各自拿到一个实例,一个人用完了调用delInstance接口将实例释放,那么另外一个人使用的时候就会出现异常,因此为了解决这个问题,我们引入一个计数器,当所有的人都不在使用的时候才去真正的去释放掉;如下:

对于这种单例的使用还要注意一个问题就多线程并发访问的问题:需要加锁

饿汉模式:(程序运行起来以后就创建了,不管用户使用或者是不使用,如下面的对象a就是一直存在)

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com