【C++】单例模式

news2024/11/25 2:19:34

目录

1.如何提供一个全局变量来记录函数调用次数呢?

        2.1饿汉模式

        2.2懒汉模式

                2.2.1实现一个内嵌垃圾回收类 

懒汉的另一种写法


1.如何提供一个全局变量来记录函数调用次数呢?

声明定义分离

func.h 

extern int Count ;//声明

func.cpp

#include "func.h"


int Count = 0;//定义

void func()
{
	for (int i = 10; i > 0; i--)
	{
		++Count;
	}
}

test.cpp

#include "func.h"


int main()
{
	func();
	cout << "count:" << Count << endl;
	return 0;
}

 

2.单例模式

定义:一个类只能创建一个对象,即单例模式,该模式可以保证系统中该类只有一个实例,并提供一个访问它的全局访问(GetInstance)该实例被所有程序模块共享(所以文件都可以访问)。

2.1饿汉模式

饿汉模式:饿了随时准备吃,在调用之前就定义好了

singleton.h 

  • 单例模式只有一个对象:那么构造函数私有且声明一个静态对象(类::静态对象函数可以访问),再除了singleton.h的任意一个文件定义,再使用一个静态成员去取那个唯一的对象就达到需求;
  • 单例不可以拷贝,所有拷贝构造防拷贝;赋值重载不需要,因为赋值重载需要两个定义的对象
//饿汉模式
class GetInformation
{
public:
	static GetInformation& GetInstance()
	{
		return instance;
	}
	void Add(const int n)//对象私有+需要一个接口函数
	{
		_count += n;
	}
	int GetConut()//个数
	{
		return _count;
	}
	GetInformation(const GetInformation& instance)=delete;//单例不能拷贝,防拷贝
private:

	GetInformation(int n=0)
		:_count(n)
	{}
	int _count;

	static GetInformation instance;//类里面都是声明
};

singleton.cpp 

#include "singleton.h"
GetInformation GetInformation::instance(0);//定义,静态成员可以用类名+::访问

void func()
{
	for (int i = 10; i > 0; i--)
	{
        GetInformation::GetInstance().Add(1);
	}
}

test.cpp

#include "singleton.h"
int main()
{
	
	func();
	cout << "GetCount:" << GetInformation::GetInstance().GetConut() << endl;
	return 0;
}

执行结果

 

 2.2懒汉模式

懒汉模式:在第一次调用时才定义

singleton.h 

  • 单例模式只有一个对象:那么构造函数私有且声明一个静态对象指针(类::静态对象函数可以访问),再除了singleton.h的任意一个文件定义为nullptr,在第一次调用是new一个对象;再使用一个静态成员去取那个唯一的对象就达到需求
  • 单例不可以拷贝,所有拷贝构造防拷贝;赋值重载不需要,因为赋值重载需要两个定义的对象
//懒汉模式
class GetInformation
{
public:
	static GetInformation& GetInstance()
	{
		if (instance == nullptr)//第一次调用new一个对象处理
		{
			instance = new GetInformation;
		}
		return *instance;
	}

	void Add(const int n)
	{
		instance->_count += n;
	}

	int GetConut()
	{
		return instance->_count;
	}

	GetInformation(const GetInformation& instance) = delete;//防拷贝

	GetInformation(int n = 0)
		:_count(n)
	{}

private:

	int _count;
	static GetInformation* instance;类里面都是声明
};

singleton.cpp 

#include "singleton.h"

GetInformation* GetInformation::instance=nullptr;//定义,静态成员可以用类名+::访问

void func()
{
	for (int i = 10; i > 0; i--)
	{
		GetInformation::GetInstance().Add(1);
	}
}

test.cpp

#include "singleton.h"

int main()
{
	func();
	cout << "Getount:" << GetInformation::GetInstance().GetConut() << endl;
	return 0;
}

执行结果

2.2.1实现一个内嵌垃圾回收类 

  • 在懒汉模式中声明周期结束,只有一个对象指针,new出来的空间没有得到释放
  •  一般懒汉的单例对象,不需要回收,因为进程正常结束,资源都会还给系统,这个对象只有一个系统自动回收也没什么问题, 但是如果在单例对象释放析构时,有一些要完成的动作,比如要记录日志等等。那么可以考虑搞一个类似下面的回收类帮助去完成这个事情.

singleton.h 

  • 生命周期结束,内嵌垃圾回收类对象自动析构
//懒汉模式
class GetInformation
{
public:
	static GetInformation& GetInstance()
	{
		if (instance == nullptr)
		{
			instance = new GetInformation;
		}
		return *instance;
	} 
	GetInformation(const GetInformation& instance) = delete;

	GetInformation(int n = 0)
		:_count(n)
	{}
	// 实现一个内嵌垃圾回收类 
	class CGarbo
	{
		~CGarbo()
		{
			if (instance != nullptr)
			{
				delete instance;
			}
		}
	private:
	};
private:
	static CGarbo _CGarbo;

	int _count;
	static GetInformation* instance;//声明
};

singleton.cpp

#include "singleton.h"

GetInformation* GetInformation::instance=nullptr;//定义,静态成员可以用类名+::访问
GetInformation::CGarbo _CGarbo;//垃圾回收定义

懒汉模式和饿汉模式的优缺点

 

懒汉的另一种写法

  • 在C++11更推荐这种懒汉写法,它解决了懒汉的缺点
//饿汉模式
class GetInformation
{
public:
	static GetInformation& GetInstance()
	{
		// C++98 中多线程调用时,static sInst对象构造初始化并不能保证下线程安全
		// C++11 优化了这个问题,C++11中static sInst对象构造初始化是线程安全的
		static GetInformation instance;

		return instance;
	}
	void Add(const int n)
	{
		_count += n;
	}
	int GetConut()
	{
		return _count;
	}

	GetInformation(const GetInformation& instance)=delete;
private:

	GetInformation(int n=0)
		:_count(n)
	{}
	int _count;
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/65322.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何实现人机界面与多台plc之间无线通讯?

本文将以MCGS触摸屏与三菱FX5U PLC基于MODBUS协议下的无线通信为例&#xff0c;为大家详细讲解如何用无线方式解决触摸屏与PLC之间的通讯问题。 测试设备与参数 1. 三菱PLC型号&#xff1a;FX5U *1台 2. 触摸屏型号&#xff1a;昆仑通态TPC7062TD *1台 3. 无线通讯设备&…

Nginx中配置GZIP压缩详解

网站访问速度对用户来说是很重要的体验&#xff0c;有时候除了增大带宽外&#xff0c;还需要对文件进行压缩。 首先找到Nginx安装路径下的配置文件&#xff1a; 保存后&#xff0c;使用nginx -t检查配置文件是否OK&#xff1a; 上述报错证明nginx在编译安装时候没有连同http_s…

Grafana+Prometheus打造运维监控系统(二)-数据获取篇-node_exporter

要实现各种数据指标采集&#xff0c;需要安装不同的数据导出器&#xff0c;常用的导出器有node_exporter、process-exporter、blackbox_exporter&#xff0c;这里简单讲一下node_exporter&#xff0c;node_exporter安装参考上篇&#xff1a;https://blog.csdn.net/zcm545186061…

SpringCloud Nacos入门教程

服务发现和服务健康监测 动态配置服务 动态DNS服务 服务及其元数据管理 二、Nacos快速开始 结构图&#xff1a; Nacos 依赖 Java 环境来运行。如果您是从代码开始构建并运行Nacos&#xff0c;还需要为此配置 Maven环境&#xff0c;请确保是在以下版本环境中安装使用: 64 …

木聚糖-聚乙二醇-聚丙烯酸|PAA-PEG-Xylan|聚丙烯酸-PEG-木聚糖

木聚糖-聚乙二醇-聚丙烯酸|PAA-PEG-Xylan|聚丙烯酸-PEG-木聚糖 英文名称&#xff1a;Xylan-PAA 别称&#xff1a;聚丙烯酸修饰木聚糖&#xff0c;聚丙烯酸-木聚糖 PEG接枝修饰木聚糖 木聚糖-聚乙二醇-聚丙烯酸 PAA-PEG-Xylan 聚丙烯酸-PEG-木聚糖 纯度&#xff1a;95% …

1. 英文SCI论文引言写作四步走模型学习笔记

课程链接 目录 课程链接 一、利用逆向工程建立引言模型 1. 说明研究重要性 2. 提供事实依据&#xff0c;为啥这么重要 3. 目前研究关注的研究点 4. 现有研究如何解决该问题 4.1 研究断层 4.2 现有研究如何解决 连接词举例 5. 我们的研究怎么做、研究动机与方法 研究…

[AI] 优先级LRTA*搜索算法 Prioritized-LRTA*

Prioritized-LRTA*一、算法原理二、举个栗子&#xff01;参考一、算法原理 原文点这儿&#xff01; 优先级扫描&#xff08;Prioritized Sweeping&#xff09;是一种用于强化学习问题的算法&#xff0c;它根据优先级排序的状态更新执行异步动态规划&#xff08;Moore & A…

30_待机唤醒实验

目录 待机唤醒 STM32的3种低功耗模式: 相关寄存器讲解 相关库函数介绍 待机唤醒配置步骤: 实验源码: 待机唤醒 很多单片机有低功耗模式,STM32也不例外。在系统或者电源复位后,微控制器出于运行状态之下, HCLK为CPU提供时钟,内核执行代码。当CPU不需要继续运行时,可以利用…

Google,微软等世界级大厂的面试套路,原来如此

最近在读吴军老师的《硅谷来信谷歌方法论》&#xff0c;其实&#xff0c;吴军老师谈到了很多谷歌&#xff0c;微软&#xff0c;高盛等世界级公司面试的问题&#xff0c;我从中启发很多&#xff0c;也理解了开放性问题对于一个人的重要性。开放性问题并不具有标准答案&#xff0…

(附源码)ssm医疗管理系统 毕业设计 260952

SSM医疗管理系统 摘 要 随着社会的发展与科技的进步&#xff0c;医疗的管理越来越复杂&#xff0c;过去的信息记录已经无法满足医院的需要。近些年随着电脑普及和数字信息技术发展&#xff0c;可以讲信息技术运用于医院的信息管理。促进医院各部门之间协调工作&#xff0c;提高…

[附源码]计算机毕业设计JAVA疫情状态下病房管理平台

[附源码]计算机毕业设计JAVA疫情状态下病房管理平台 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM …

React跨域请求,http-proxy-middleware代理服务,Axios实现前端请求

React Axios跨域请求 React跨域React Axios跨域请求一、跨域概念二、前后端中跨域现象三、跨域解决方案&#xff08;2种&#xff09;0、产生原因1、前端解决&#xff08;React框架&#xff09;解决原理&#xff1a;配置过程2、后端解决&#xff08;Spring-boot配置&#xff0…

可观测性神器之 Micrometer

简介 对于大部分开发人员来说可能用过普罗米修斯 Grafana 这样的监控系统&#xff0c;从未听说过 Micrometer 工具&#xff0c;这里就详细的来介绍下可观测性神器 Micrometer&#xff0c;让你在开发时使用它就和使用 SLFJ 日志系统一样简单易用&#xff0c;有效的提升系统的健…

使用DevExpress WPF主题设计器轻松创建Office 2019绿色主题(一)

DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序&#xff0c;这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 DevExpress WPF的The…

使用JavaRestClient查询文档排序、分页、高亮

可以参考着“利用JavaRestClient实现文档的CRUD&#xff08;从mysql数据库转移到es&#xff09;”来看 http://t.csdn.cn/SP5nx 1、解析响应的方法 private void handleResponse(SearchResponse response) {// 4.解析响应SearchHits searchHits response.getHits();// 4.1.获取…

NPM相关

npm包管理工具,安装完node.js,就有npm相关 winR node -v 查看node版本 npm -v 查看npm版本 node.js与npm的关系,只能说node.js里内嵌了npm 功能相关 npm的一些命令 npm conf ls 和 npm config list 都是查看npm配置信息 没有区别 注意:如果你是在当前目录下,比如我这…

头部咨询管理企业的数字化转型之路

咨询管理行业前景与现状&#xff01; 5000字讲解3家头部咨询企业案例&#xff0c;希望能给大家在数字化方面带来一些启发。&#xff08;找客服&#xff0c;可获取咨询行业解决方案详细版&#xff09; 1、数字化转型同样是咨询行业的大命题 新冠疫情发生以来&#xff0c;各行…

Linux重定向原理与系统调用dup2

&#x1f9f8;&#x1f9f8;&#x1f9f8;各位大佬大家好&#xff0c;我是猪皮兄弟&#x1f9f8;&#x1f9f8;&#x1f9f8; 文章目录一、重定向原理①输出重定向②输入重定向二、重定向的系统调用dup2dup2输出重定向三、如何理解一切皆文件四.缓冲区①常见的缓冲区刷新策略②…

【数据结构与算法】B树与B+树

&#x1f525; 本文由 程序喵正在路上 原创&#xff0c;CSDN首发&#xff01; &#x1f496; 系列专栏&#xff1a;数据结构与算法 &#x1f320; 首发时间&#xff1a;2022年12月6日 &#x1f98b; 欢迎关注&#x1f5b1;点赞&#x1f44d;收藏&#x1f31f;留言&#x1f43e;…

电脑e盘不见了怎么恢复?6个步骤找回e盘

电脑e盘不见虽然不是一件常见的事&#xff0c;但是也会有发生的情况。虽然我们还有其他磁盘&#xff0c;平时也会经常忽略e盘。但是e盘也是一个存储磁盘&#xff0c;当电脑e盘不见了&#xff0c;我们也会想要找回来。那么电脑里的e盘丢失了怎么找回呢&#xff1f;下面我们就一起…