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云打包免费有次数 切换一个账号继续

使用SOAP与TrinityCore交互(待定)

原文&#xff1a;SOAP with TrinityCore | TrinityCore MMo Project Wiki 如何使用SOAP与TC交互 SOAP代表简单对象访问协议&#xff0c;是一种类似于REST的基于标准的web服务访问协议的旧形式。只要必要的配置到位&#xff0c;您就可以利用SOAP向TrinityCore服务器发送命令。 …

Open3D 计算点云配准的精度和重叠度

目录 一、概述 1.1计算配准精度 1.2计算点云重叠度 二、代码实现 2.1关键函数 2.2完整代码 三、实现效果 3.1原始点云 3.2计算结果 一、概述 在点云配准中,精度和重叠度是两个重要的评价指标。精度通常用均方根误差(RMSE)来衡量,而重叠度则表示两个点云在…

centos环境启动/重启java服务脚本优化

centos环境启动/重启java服务脚本优化 引部分命令说明根据端口查询服务进程杀死进程函数脚本接收参数 脚本注意重启文档位置异常 引 在离线环境部署的多个java应用组成的系统&#xff0c;测试阶段需要较为频繁的发布&#xff0c;因资源限制&#xff0c;没有弄devops或CICD那套…

华为手机联系人不见了怎么恢复?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…

物联网时代的等保测评:保障万物互联的安全

随着物联网&#xff08;IoT&#xff09;技术的飞速发展&#xff0c;我们的生活正逐渐进入一个万物互联的新时代。从智能家居到智慧城市&#xff0c;从无人驾驶到农业物联网&#xff0c;IoT技术正在渗透到我们生活的方方面面。然而&#xff0c;随着IoT设备数量的激增&#xff0c…

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;最后当…

python(餐厅点餐系统)

全部代码&#xff1a; meau_lis[[1,"牛排",50],[2,"羊排",80],[3,"大盘鸡",50],[4,"火锅鸡",68],[5,"猪大骨",35],[6,"米饭",2],[7,"寿司",5],[8,"大饼",6],[9,"小米粥",1],[10,&…

深入理解MySQL中的EXPLAIN及type列

在MySQL中&#xff0c;EXPLAIN是一个强大的工具&#xff0c;它可以帮助我们理解SQL查询的执行计划。通过使用EXPLAIN&#xff0c;我们可以获取到查询的详细信息&#xff0c;包括如何执行查询&#xff0c;以及查询的各个部分如何连接在一起。在本篇博客中&#xff0c;我们将重点…

Redis+Caffeine 实现两级缓存实战

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

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

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