C++易错知识点笔记(九)学了静态成员函数,现在尝试写一个单例模式

单例模式是指一个类只能创建一个类对象,本文从第一种单例模式的写法开始介绍,后一种单例模式均是对前一种单例模式可能出现的问题的改进,写法大同小异,读者可跟随文章一起分析。第一种单例模式#include<iostream>using namespace std;class Clog {private: static Clog* ptr; Clog() = default;public: //唯一的创建类的接口 static Clog* createObject(){ if(p
摘要由CSDN通过智能技术生成

单例模式是指一个类只能创建一个类对象,本文从第一种单例模式的写法开始介绍,后一种单例模式均是对前一种单例模式可能出现的问题的改进,写法大同小异,读者可跟随文章一起分析。

第一种单例模式

#include<iostream>
using namespace std;
class Clog {
   
private:
	static Clog* ptr;
	Clog() = default;
public:
	//唯一的创建类的接口
	static Clog* createObject(){
   
		if(ptr==nullptr)
		    ptr=new Clog();
		return ptr;
	}
};
Clog* Clog::ptr = nullptr;


int main()
{
   
	Clog* p = Clog::createObject();
	Clog* p1 = Clog::createObject();

	delete p;
	delete p1;
	//指针接收创建这个唯一的类就是需要手动释放资源,容易引起线程安全问题
}

分析
1)将构造函数声明为私有,而暴露一个createObject()函数创造类对象。
2)将createObject()类对象声明为static,方便我们直接用类名调用该函数,而不必陷入“调用函数应该先创建对象,而创建对象需要调用该函数的这种鸡生蛋,蛋生鸡” 问题。
3)现在需要一个Clog类的指针作为createObject()函数的返回值,而只有静态成员变量才能不用对象就可以调用,而且静态函数内部只能用静态成员变量,所以在类中声明一个静态的Clog指针。
4)在main函数中直接调用Clog类中的createObject方法,会返回一个Clog类对象的指针=Clog::ptr,是Clog类中的静态成员变量,所以不论在main函数中调用多少次,返回的都是唯一的那一个Clog类中的静态成员变量ptr的值。
5)从此我们想要在程序的任何地方使用该单例对象都可以直接调用Clog类中的createObject方法返回这个对象供我们操作。也就是说实现了单例模式,单例模式有什么用呢?比如说我们编程序的时候想要记录我们的日志,那么就可以用这个唯一的单例模式的类对象进行记录。
该方法的不足之处
createObject()函数返回的是Clog*类型new出来的堆对象,我们需要注意内存释放的问题。容易引起线程安全性问题。
这里说明一个解决线程安全性的解法:

#include <iostream>	
#include <mutex>
using
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值