VSCode上通过C++实现单例模式

        单例模式实际上就是为了确保一个类最多只有一个实例,并且在程序的任何地方都可以访问这个实例,也就是提供一个全局访问点,单例对象不需要手动释放,交给系统来释放就可以了,单例模式的设计初衷就是为了在整个应用程序的生命周期中只创建一个实例,并且在需要时重复使用该实例,而不是频繁地创建和销毁对象。因此,在应用程序运行期间,单例对象通常会一直存在,直到应用程序结束。

        一般来说,实现单例模式的方式有两种,一种是懒加载的方式,另外一种是预加载的方式。

实际上实现单例模式的基本步骤其实是一样的。第一步都是将构造函数和析构函数私有化,然后定义一个静态单例对象和声明一个静态单例对象获取函数,最后初始化单例对象和定义单例对象获取函数。

        懒加载:当使用到单例对象的时候,才创建这个对象。

main函数

#include"Test.h"
#include<iostream>
int main()
{Test*t1=Test::get_instance();Test*t2=Test::get_instance();std::cout<<"t1:"<<t1<<std::endl;std::cout<<"t2:"<<t2<<std::endl;return 0;
}

Test.h 

        将构造函数私有化,可以阻止外部代码直接实例化类的对象,强制使用单例模式提供的静态方法来获取类的唯一实例。这样可以确保在整个应用程序中只有一个实例存在。通过私有化析构函数,可以防止外部代码直接删除单例对象,从而确保单例对象在整个应用程序的生命周期内保持存在。这有助于避免意外的对象销毁和内存泄漏。

        将单例对象(t_instance)声明为静态的是为了确保单例对象的唯一性、全局访问性和简化访问方式。静态单例对象可以在整个应用程序中被直接访问,避免多次实例化的情况发生,符合单例模式的设计原则

class Test
{
public:
static Test*get_instance();
private:
Test();
~Test();
static Test*t_instance;
};

 Test.cpp

#include"Test.h"
Test*Test::t_instance=nullptr;
Test *Test::get_instance()
{if(t_instance==nullptr){t_instance=new Test();}return t_instance;
}
Test::Test()
{}
Test::~Test()
{
delete t_instance;
}

运行代码,可以发现,两个Test对象的地址是一样的,也就是说明这两个对象是同一个对象。 

上面这种写法的懒加载其实是线程不安全的,当多个线程调用get_instance函数时,可能会创建出多个对象,将单例获取函数改进一下就可以了。

#include<mingw.mutex.h>
class Test
{
public:
static Test*get_instance();
private:
Test();
~Test();
static Test*t_instance;
static std::mutex tmutex;
};
#include"Test.h"
Test*Test::t_instance=nullptr;
std::mutex Test::tmutex;
Test *Test::get_instance()
{if(t_instance==nullptr){std::lock_guard<std::mutex>lk(tmutex);t_instance=new Test();}return t_instance;
}
Test::Test()
{}
Test::~Test()
{
delete t_instance;
}

        预加载:程序启动的时候,就将对象创建好。

只需要更改懒加载的Test.cpp就可以了,不必判断单例对象是否为空,在类被第一次使用的时候就直接创建好了单例对象。

#include"Test.h"
Test*Test::t_instance=new Test();
Test *Test::get_instance()
{return t_instance;
}
Test::Test()
{}
Test::~Test()
{
delete t_instance;
}

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

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

相关文章

vue 下拉菜单树形结构——vue-treeselect的组件使用

参考&#xff1a; https://www.cnblogs.com/syjtiramisu/p/17672866.htmlhttps://www.cnblogs.com/syjtiramisu/p/17672866.html vue-treeselect的使用 - 简书下载依赖 使用https://www.jianshu.com/p/459550e1477d 实际项目使用&#xff1a;

uni-app iOS上架相关App store App store connect 云打包有次数限制

相册权限 uni-app云打包免费有次数 切换一个账号继续

华为手机联系人不见了怎么恢复?3个解决方案

华为手机联系人列表就像是我们精心编织的社交网络之网。然而&#xff0c;有时&#xff0c;这张网可能会因为各种原因而意外破损&#xff0c;联系人信息消失得无影无踪&#xff0c;让我们陷入“人脉孤岛”的困境。华为手机联系人不见了怎么恢复&#xff1f;别担心&#xff0c;我…

构建高质量数据集与智能数据工程平台:播客AI Odyssey深度对话实录

对话整数智能联创和前IDEA研究员&#xff1a;构建高质量数据集与智能数据工程平台 - AI Odyssey | 小宇宙 - 听播客&#xff0c;上小宇宙 人工智能技术的日益深远发展&#xff0c;对人工智能的性能提升与技术迭代提出了新的要求。在大模型训练中&#xff0c;已有的研究和实践表…

【操作系统】进程管理——用信号量机制解决问题,以生产者-消费者问题为例(个人笔记)

学习日期&#xff1a;2024.7.10 内容摘要&#xff1a;利用信号量机制解决几个经典问题模型 目录 引言 问题模型 生产者-消费者问题&#xff08;经典&#xff09; 多生产者-多消费者问题 吸烟者问题 读者写者问题&#xff08;难点&#xff09; 哲学家进餐问题&#xff0…

解决POST请求中文乱码问题

解决POST请求中文乱码问题 1、乱码原因2、解决方法3、具体步骤 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在Web开发中&#xff0c;处理POST请求时经常遇到中文乱码问题&#xff0c;这主要是由于服务器在接收到POST请求的数据后&#x…

BUG解决:postman可以请求成功,但Python requests请求报403

目录 问题背景 问题定位 问题解决 问题背景 使用Python的requests库对接物联数据的接口之前一直正常运行&#xff0c;昨天突然请求不通了&#xff0c;通过进一步验证发现凡是使用代码调用接口就不通&#xff0c;而使用postman就能调通&#xff0c;请求参数啥的都没变。 接口…

SSL 证书错误:如何修复以及错误发生的原因

SSL证书可以提升网站的可信度。然而&#xff0c;如果您的SSL证书出现错误&#xff0c;您可能会得到一个“不安全”的标签&#xff0c;这可能会导致访问者失去对您网站的信任并转向竞争对手。 本文将介绍SSL证书错误的原因及其对用户的潜在影响。随后&#xff0c;我们将提供详细…

MybatisPlus 核心功能

MybatisPlus 核心功能 文章目录 MybatisPlus 核心功能1. 条件构造器1.1 QueryWrapper1.2 LambdaQueryWrapper&#xff08;推荐&#xff09;1.3 UpdateWrapper1.4 LambdaUpdateWrapper 2. 自定义SQL3. Service接口 1. 条件构造器 当涉及到查询或修改语句时&#xff0c;MybatisP…

界面组件Kendo UI for React 2024 Q2亮点 - 生成式AI集成、设计系统增强

随着最新的2024年第二季度发布&#xff0c;Kendo UI for React为应用程序开发设定了标准&#xff0c;包括生成式AI集成、增强的设计系统功能和可访问的数据可视化。新的2024年第二季度版本为应用程序界面提供了人工智能(AI)提示&#xff0c;从设计到代码的生产力增强、可访问性…

Java毕业设计 基于SSM vue图书管理系统小程序 微信小程序

Java毕业设计 基于SSM vue图书管理系统小程序 微信小程序 SSM 图书管理系统小程序 功能介绍 用户 登录 注册 首页 图片轮播 图书信息推荐 图书详情 赞 踩 评论 收藏 系统公告 公告详情 用户信息修改 我的待还 图书归还 催还提醒 我的收藏管理 意见反馈 管理员 登录 个人中心…

绝地求生PUBG奇幻大乱斗怎么玩 奇幻大乱斗什么时候回归

《绝地求生》(PUBG) 是由韩国开发的一款战术竞技型射击类沙盒游戏&#xff0c;游戏中我们需要和队友组队乘坐飞机跳伞到达一座空岛&#xff0c;之后我们需要搜索一切我们可以用到的物资&#xff0c;之后我们于敌人进行对战&#xff0c;期间不断躲避毒圈的追击&#xff0c;最后当…

Redis+Caffeine 实现两级缓存实战

RedisCaffeine 实现两级缓存 背景 ​ 事情的开始是这样的&#xff0c;前段时间接了个需求&#xff0c;给公司的商城官网提供一个查询预计送达时间的接口。接口很简单&#xff0c;根据请求传的城市仓库发货时间查询快递的预计送达时间。因为商城下单就会调用这个接口&#xff…

防火墙安全策略及用户认证实验

目录 一、实验拓扑 二、实验要求 三、实验思路 四、实验配置 1、配置vlan 2、配置路由器、防火墙IP地址&#xff0c;划分区域 3、配置安全策略 ​策略一&#xff1a; 策略二&#xff1a; 策略三&#xff1a; 4、配置用户认证 策略一&#xff1a; 策略二&#xff1a…

WebGIS基础原理

该部分内容与部分插图、学习框架的主要参考的网站与博主如下&#xff08;也趁机分享给大家&#xff09;&#xff1a; OSGeo开源WebGIS在线教程&#xff1a;http://webgis.cn/ OSGeo《地理信息系统原理》&#xff1a;https://www.osgeo.cn/gis-tutorial/index.html OSGeo《Pyth…

DSC主备归档报错

先看一个报错&#xff1a; 2024-07-10 22:12:21.725 [ERROR] database P0000003511 T0000000000000003696 rafil_list_overlap_consecutive_check failed, rfil(DMDATA/data/DSC02/arch/ARCHIVE_LOCAL1_0x57843343_EP1_2024-07-10_20-44-40.log)->next_seq(2901) > nex…

部署Harbor仓库

本章内容&#xff1a; 安装docker-ce部署harbor仓库上传和拉取 1.安装docker 1&#xff09;拉取源码 yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 2&#xff09;安装docker-ce yum -y install docker-ce 3&#…

C++入门到进阶(图文详解,持续更新中)

C入门到进阶&#xff08;图文详解&#xff0c;持续更新中&#xff09; 目录 C入门到进阶&#xff08;图文详解&#xff0c;持续更新中&#xff09; 数据 数据类型 基本数据类型/内置数据类型 C常用运算符 赋值运算符 关系运算符 逻辑运算符 杂项运算符 数据的本地化…

第二课:使用域名dns ping通www.baidu.com

需要一台dns服务器&#xff0c;实现域名解析&#xff0c;把对应的网址变为Ip地址。 首先按照之前博客的配置&#xff0c;自动分配给PC1和PC2的IP地址等相关配置。 然后增加一台server交换机连接到交换机上&#xff0c;配置好ip地址&#xff0c;192.168.1.100。在dnsServer中。…

7.11日学习打卡----初学Redis(六)

7.11日学习打卡 目录&#xff1a; 7.11日学习打卡一. redis事务事务的概念与ACID特性Redis事务三大特性Redis事务执行的三个阶段Redis事务基本操作 二. redis集群主从复制主从复制环境搭建主从复制原理剖析 哨兵监控哨兵监控环境搭建哨兵工作原理剖析 故障转移Cluster模式Clust…