C++中只能有一个实例的单例类
C++中只能有一个实例的单例类
前面讨论的 President 类很不错,但存在一个缺陷:无法禁止通过实例化多个对象来创建多名总统:
President One, Two, Three;
由于复制构造函数是私有的,其中每个对象都是不可复制的,但您的目标是确保 President 类有且只有一个化身,即有了一个 President 对象后,就禁止创建其他的 President 对象。要实现这种功能强大的模式,可使用单例的概念,它使用私有构造函数、私有赋值运算符和静态实例成员。
提示:
将关键字 static 用于类的数据成员时,该数据成员将在所有实例之间共享。
将 static 用于函数中声明的局部变量时,该变量的值将在两次调用之间保持不变。
将 static 用于成员函数(方法)时,该方法将在所有成员之间共享。
要创建单例类,关键字 static 必不可少,如以下示例程序所示:
#include <iostream>
#include <string>
using namespace std;class President
{private:President() {}; // private default constructorPresident(const President&); // private copy constructorconst President& operator=(const President&); // assignment operatorstring name;public:static President& GetInstance(){// static objects are constructed only oncestatic President onlyInstance; return onlyInstance;}string GetName(){ return name; }void SetName(string InputName){ name = InputName; }
};int main()
{President& onlyPresident = President::GetInstance();onlyPresident.SetName("Abraham Lincoln");// uncomment lines to see how compile failures prohibit duplicates// President second; // cannot access constructor// President* third= new President(); // cannot access constructor// President fourth = onlyPresident; // cannot access copy constructor// onlyPresident = President::GetInstance(); // cannot access operator=cout << "The name of the President is: ";cout << President::GetInstance().GetName() << endl;return 0;
}
输出:
The name of the President is: Abraham Lincoln
分析:
第 28~43 行的 main( )包含大量注释,演示了各种创建 President 实例和拷贝的方式,它们都无法
通过编译。下面逐一进行分析。
34: // President second; // cannot access constructor
35: // President* third= new President(); // cannot access constructor
第 34 和 35 行分别试图使用默认构造函数在堆和自由存储区中创建对象, 但默认构造函数不可用,因为它是私有的,如第 7 行所示。
36: // President fourth = onlyPresident; // cannot access copy constructor
第 36 行试图使用复制构造函数创建现有对象的拷贝(在创建对象的同时赋值将调用复制构造函数),但在 main( )中不能使用复制构造函数,因为第 8 行将其声明成了私有的。
37: // OnlyPresident = President::GetInstance(); // cannot access operator=
第 37 行试图通过赋值创建对象的拷贝,但行不通,因为第 9 行将赋值运算符声明成了私有的。因此, 在main( )中, 不能创建President类的实例, 唯一的方法是使用静态函数GetInstance( )来获取President的实例,如第 30 行所示。 GetInstance( )是静态成员,类似于全局函数,无需通过对象来调用它。GetInstance( )是在第 14~19 行实现的, 它使用静态变量 onlyInstance 确保有且只有一个 President 实例。
为更好地理解这一点,可以认为第 17 行只执行一次(静态初始化),因此 GetInstance( )返回唯一一个President 实例,而不管您如何频繁地调用 President:: GetInstance( )。
该文章会更新,欢迎大家批评指正。
推荐一个零声学院的C++服务器开发课程,个人觉得老师讲得不错,
分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,
fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,
TCP/IP,协程,DPDK等技术内容
点击立即学习:C/C++后台高级服务器课程
相关文章:
C++中只能有一个实例的单例类
C中只能有一个实例的单例类 前面讨论的 President 类很不错,但存在一个缺陷:无法禁止通过实例化多个对象来创建多名总统: President One, Two, Three; 由于复制构造函数是私有的,其中每个对象都是不可复制的,但您的目…...
单张图像3D重建:原理与PyTorch实现
近年来,深度学习(DL)在解决图像分类、目标检测、语义分割等 2D 图像任务方面表现出了出色的能力。DL 也不例外,在将其应用于 3D 图形问题方面也取得了巨大进展。 在这篇文章中,我们将探讨最近将深度学习扩展到单图像 3…...
340条样本就能让GPT-4崩溃,输出有害内容高达95%?OpenAI的安全防护措施再次失效
仅需340个示例微调GPT-4,即可绕过安全限制,让模型说出“枪支改装方法”、“生化武器制作过程”等有害内容? OpenAI的安全防护措施再次失效,攻击的成功率高达95%! 近日,美国顶尖大学UIUC与斯坦福联合对GPT…...
2023.11.17使用flask将多个图片文件上传至服务器
2023.11.17使用flask将多个图片文件上传至服务器 实现功能: 1、同时上传多个图片文件 2、验证文件扩展名 3、显示上传文件的文件名 4、显示文件上传结果 程序结构 main.py from flask import Flask, request, jsonify, render_template import osapp Flask(__n…...
母婴服务预约小程序的效果如何
二胎家庭增速明显,占比较大,成为市场各母婴品牌的目标,而随着行业发展及市场变化,线上互联网深入人们生活,各家母婴品牌开始向“数字化”靠拢。 目前母婴门店商家主要面临服务/产品线上曝光不足、宣传度不够或扩圈无门…...
Flask实现cookie 开发
要在Flask中实现cookie的开发,可以通过使用Flask提供的set_cookie()和get_cookie()函数来设置和获取cookie值。以下是一个示例,演示如何在Flask应用中使用cookie: from flask import Flask, request, make_responseapp Flask(__name__)app.…...
2311rust,到60版本更新
1.54.0稳定版 属性可调用类似函数的宏 Rust1.54支持在属性中调用类似函数的宏.类似函数的宏是像基于macro_rules!宏一样调用的或像macro!(...)一样的过程宏. 注意,常见用例是,在Rust文档注解中包含其他文件中的文档.如,如果项目的README代表了一个很好的文档注释,则可用incl…...
【开源】基于Vue和SpringBoot的微信小程序的音乐平台
项目编号: S 055 ,文末获取源码。 \color{red}{项目编号:S055,文末获取源码。} 项目编号:S055,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统展示 四、核心代码4.1 查询单首…...
adb手机调试常用命令
查看手机型号 adb shell getprop ro.product.model 查看电池状况 adb shell dumpsys battery 查看分辨率 adb shell wm size 查看屏幕密度 adb shell wm density 查看显示屏参数 adb shell dumpsys window displays 查看android_id adb shell settings get secure android…...
IDEA常用插件合集
功能类: 1、Background Image Plus 换壁纸 2、Chinese(Simplified)... 中文语言包 3、Translation 代码翻译 4、Key Promoter X 快捷键提示插件 5、Rainbow bracket 彩虹括号插件 6、Code Glance 代码小地图 效率类 : 1、Tabnine AI Code C…...
【算法】滑动窗口题单——2.不定长滑动窗口(求最长/最大)
文章目录 3. 无重复字符的最长子串1493. 删掉一个元素以后全为 1 的最长子数组904. 水果成篮1695. 删除子数组的最大得分2841. 几乎唯一子数组的最大和2024. 考试的最大困扰度1004. 最大连续1的个数 III1438. 绝对差不超过限制的最长连续子数组2401. 最长优雅子数组解法1——维…...
电子学会C/C++编程等级考试2022年03月(一级)真题解析
C/C++等级考试(1~8级)全部真题・点这里 第1题:双精度浮点数的输入输出 输入一个双精度浮点数,保留8位小数,输出这个浮点数。 时间限制:1000 内存限制:65536输入 只有一行,一个双精度浮点数。输出 一行,保留8位小数的浮点数。样例输入 3.1415926535798932样例输出 3.1…...
Libvirt-Qemu-Kvm 操作手记
(持续更新~) 本文主要用于记录在操作libvirt qemu kvm过程中遇到的问题及原因分析。 Hugepage 让qemu使用大页可以减少tdp的size,一定程度上可以提高性能;使用大页可以用memfd或者file backend。 memfd 操作步骤如下: 在系统中reserv…...
代码随想录算法训练营第二十八天| 78 子集 90 子集|| 93 复原IP地址
78 子集 由题意可知数组中的元素互不相同,所以在dfs中我们可以将当前的path直接加入到res中。 class Solution {List<List<Integer>>res new ArrayList<>();List<Integer>path new LinkedList<>();public List<List<Integer…...
9 HDFS架构剖析
问题 100台服务器,存储空间单个200GB 20T 5T文件如何存储? 128MB一块 128MB81GB 1288*10241TB 5T数据分成的128MB的块数 8192 * 5 客户端(client)代表用户通过与namenode和datanode交互来访问整个文件系统。 HDFS集群有两类节点: 一个na…...
Python中的迭代器、生成器和装饰器
当谈到Python中的迭代器、生成器和装饰器时,这三个概念都是与函数和数据处理密切相关的。让我们逐个深入了解它们。 1. 迭代器(Iterators): 迭代器是一个可以逐个访问元素的对象。在Python中,迭代器实现了两个方法&a…...
【NGINX--1】基础知识
1、在 Debian/Ubuntu 上安装 NGINX 在 Debian 或 Ubuntu 机器上安装 NGINX 开源版。 更新已配置源的软件包信息,并安装一些有助于配置官方 NGINX 软件包仓库的软件包: apt-get update apt install -y curl gnupg2 ca-certificates lsb-release debian-…...
小米路由器AX1800降级后的SSH登录和关墙等命令
http://192.168.31.1/cgi-bin/luci/;stok429aaa9c7f05ee7d0816a00257b8414a/api/misystem/set_config_iotdev?bssidXiaomi&user_idlongdike&ssid-h%3B%20nvram%20set%20ssh_en%3D1%3B%20nvram%20commit%3B%20sed%20-i%20s%…...
5-什么是猴子补丁,有什么用途?什么是反射,python中如何使用反射?http和https的区别?
1 什么是猴子补丁,有什么用途 **解释**1 Python猴子补丁(Monkey Patch)是一种在运行时动态修改代码的技术。通在不修改源代码的情况下,改变代码的执行方式或增加功能2 Monkey Patching是在 运行时(run time) 动态替换属性(attrib…...
深信服AC应用控制技术
拓扑图 目录 拓扑图 一.上班时间不允许使用qq(假设上班时间是上午9到12,下午14到18) 1.新增上班时间不允许使用qq访问权限策略 2.将策略应用到组,例如修仙部 3.验证 上班时间发现登录不了 下班时间可以登录 二.上班时间不允许访问视频网站(假设上班时…...
终极FFXIV模组管理器:TexTools完全使用指南与实战教程
终极FFXIV模组管理器:TexTools完全使用指南与实战教程 【免费下载链接】FFXIV_TexTools_UI 项目地址: https://gitcode.com/gh_mirrors/ff/FFXIV_TexTools_UI 你是否厌倦了在《最终幻想14》中与其他玩家穿着相同的装备?是否梦想着为你的光之战士…...
数据丢失时的数字救援队:TestDisk与PhotoRec的救赎之路
数据丢失时的数字救援队:TestDisk与PhotoRec的救赎之路 【免费下载链接】testdisk TestDisk & PhotoRec 项目地址: https://gitcode.com/gh_mirrors/te/testdisk 想象一下这个场景:你正准备打开电脑完成重要的工作报告,却发现硬盘…...
PVZ Toolkit终极指南:如何用专业工具解锁植物大战僵尸无限可能
PVZ Toolkit终极指南:如何用专业工具解锁植物大战僵尸无限可能 【免费下载链接】pvztoolkit 植物大战僵尸 PC 版综合修改器 项目地址: https://gitcode.com/gh_mirrors/pv/pvztoolkit 你是否曾在植物大战僵尸的战场上为资源不足而苦恼?是否想体验…...
Windows安卓应用安装革命:APK安装器深度体验与实战指南
Windows安卓应用安装革命:APK安装器深度体验与实战指南 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 你是一个文章写手,你负责为开源项目写专…...
PowerToys Text Extractor:Windows屏幕文字提取的终极解决方案
PowerToys Text Extractor:Windows屏幕文字提取的终极解决方案 【免费下载链接】PowerToys Microsoft PowerToys is a collection of utilities that supercharge productivity and customization on Windows 项目地址: https://gitcode.com/GitHub_Trending/po/P…...
初次使用 Taotoken 的开发者对平台稳定性和延迟的直观感受
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 初次使用 Taotoken 的开发者对平台稳定性和延迟的直观感受 作为一名需要接入大模型服务的开发者,选择一个稳定、响应迅…...
机器学习势函数结合自由能微扰:高效预测高熵合金熔点的混合计算框架
1. 项目概述:当机器学习遇上第一性原理,如何为高熵合金“量体温”?在材料设计的战场上,熔化温度是一个决定性的“硬指标”。对于像高熵合金这类由多种元素等比例或近等比例混合而成的新型材料,其卓越的高温强度、耐腐蚀…...
学术写作新纪元!2026一站式AI论文写作工具推荐指南
2026 年 AI 论文写作工具已进入全流程闭环 学术合规时代,千笔 AI(综合评分 99 分)中文学术场景标杆;Grammarly Academic与Elicit为英文论文写作首选;按需求匹配度 - 数据可信度 - 成本承受力三维模型选型,…...
YCbCr 转 RGB:揭秘那串神奇公式背后的百年故事
一、一个让我"开窍"的翻译故事 我大学时有个学语言学的朋友,他给我讲过一个让我至今难忘的故事。他说翻译界有一个著名的"中间语言"问题——如果你要把一本书从 50 种语言互相翻译,最笨的办法是给每两种语言之间都准备一个翻译&…...
别再只调包了!手把手教你用Python+SVM从零搭建一个中文情感分析系统(附完整代码)
从零构建中文情感分析系统:SVM实战与避坑指南第一次尝试用机器学习处理中文文本时,我被"的得地"分词的混乱结果震惊了——这堆毫无意义的字符组合,真的能训练出识别情感的模型吗?三年前那个深夜,当我看着自己…...
