C++-第二十一章:特殊类设计
目录
第一节:特殊类
1-1.不能被拷贝的类
1-2.只能在堆上构造的类
1-3.只能在栈上构造的类
1-4.只能构造一个对象的类
第二节:工厂模式
下期预告:
第一节:特殊类
1-1.不能被拷贝的类
不能被拷贝的类有线程类、std::unique_ptr、流插入和流提取。
不能被拷贝是因为它们自己的唯一性,例如:每个线程都有唯一id;还有自己的功能限制,例如:std::unique_str就是为了解决多次释放内存才特地这样设计的;最后是必要性,流插入、流提取就没有必要就拷贝多份。
1-2.只能在堆上构造的类
实现方法:
1、在private下实现一个构造函数,这样各种默认构造函数就不会生成了(默认构造、默认拷贝构造、默认移动构造、默认拷贝赋值、默认移动赋值)
2、在public:下实现一个静态函数,这个函数的功能是在堆上创建一个类对象,并把这个对象返回。
完成以上两步之后,就只能通过类域中的静态函数获取类了,而该函数是从堆上申请的空间:
class HeapOnly { private:// 第一步HeapOnly() {} public:// 第二步static HeapOnly* GetClass(){return new HeapOnly;} };
如果想传入参数用这些参数来初始化类,那么在private下实现对应参数的构造函数并在private重载一个对应参数的GetClass即可:
class HeapOnly { private:// 第一步HeapOnly() {}// 实现传入参数的类HeapOnly(int num){GetClass(num);} public:// 第二步static HeapOnly* GetClass(){return new HeapOnly;}// 重载static HeapOnly* GetClass(int num){return new HeapOnly(num);} };
1-3.只能在栈上构造的类
只能在栈上构造的类需要重载new和delete:
class StackOnly { public:// 构造函数StackOnly() {}private:// 禁用new操作符void* operator new(size_t) = delete;// 禁用new[]操作符void* operator new[](size_t) = delete;// 禁用delete操作符void operator delete(void*) = delete;// 禁用delete[]操作符void operator delete[](void*) = delete; };
1-4.只能构造一个对象的类
只能构造一个对象这种模式叫做单例模式,单例模式的实现方式如下:
(1)在private下显式创建构造函数,防止外部调用构造函数
(2)在private下声明一个该类的static对象
(3)在类外部定义(1)声明的对象
class Singleton { private:Singleton() {} // 第一步static Singleton _oneClass; // 第二步 }; // 第三步 Singleton Singleton::_oneClass;
这样的话只能使用Singleton只有 _oneClass 这一个对象了。
这种实现单例模式的方式是饿汉模式,即在main函数之前就将单例的对象生成,这种方式会有两个问题:
(1)饿汉在main函数之前创建对象,会减缓进入main函数的速度
(2)如果饿汉之间有依赖关系,还需要注意饿汉的初始化顺序
为了解决上述两个问题,于是又有了懒汉模式。
懒汉模式的特征是在第一次使用单例对象才创建对象,这需要在单例类的public下提供一个静态接口,并删除类外的单例对象定义:
class Singleton { private:Singleton() {} // 第一步static Singleton _oneClass; // 第二步 public:// 懒汉模式static Singleton* GetOneClass(){static Singleton _oneClass; // 定义return &_oneClass;} };
因为 _oneClass 的定义用static进行了修饰,那么只有第一次调用这个接口时才会初始化对象,之后的调用只是得到了单例对象的指针。
通过这个指针就可以使用_oneClass了。
第二节:工厂模式
工厂模式就是使用类创建一个"工厂",给这个工厂不同的参数,工厂就会返回一个对应对象。
假如有一个游戏,游戏中包含了不同的怪物,那么我们就可以通过工厂生成多个不同类型的怪物:
#include <iostream> #include <memory> #include <string>// 抽象基类:怪物 class Monster { public:virtual ~Monster() {}// 攻击虚函数virtual void attack() const = 0; };// 具体产品类:哥布林 class Goblin : public Monster { public:void attack() const override {std::cout << "哥布林使用匕首攻击" << std::endl;} };// 具体产品类:喷火龙 class Dragon : public Monster { public:void attack() const override {std::cout << "喷火龙使用火球术" << std::endl;} };// 工厂类 class MonsterFactory { public:static std::unique_ptr<Monster> createMonster(const std::string& type) {if (type == "哥布林") {// 构造一个哥布林return std::make_unique<Goblin>();} else if (type == "喷火龙") {// 构造一个喷火龙return std::make_unique<Dragon>();} else {return nullptr;}} };int main() {// 使用工厂创建不同类型的怪物std::unique_ptr<Monster> goblin = MonsterFactory::createMonster("哥布林");std::unique_ptr<Monster> dragon = MonsterFactory::createMonster("喷火龙");if (goblin) {goblin->attack();}if (dragon) {dragon->attack();}return 0; }
当然不止 attack 函数,还可以设置其他函数,例如行动力函数,它决定怪物的移动方式等。
下期预告:
没有下期了,因为这是最后一章了。
相关文章:
C++-第二十一章:特殊类设计
目录 第一节:特殊类 1-1.不能被拷贝的类 1-2.只能在堆上构造的类 1-3.只能在栈上构造的类 1-4.只能构造一个对象的类 第二节:工厂模式 下期预告: 第一节:特殊类 1-1.不能被拷贝的类 不能被拷贝的类有线程类、std::unique_ptr、…...
pytorch 模型测试
在使用 PyTorch 进行模型测试时,一般包含加载测试数据、加载训练好的模型、进行推理以及评估模型性能等步骤。以下为你详细介绍每个步骤及对应的代码示例。 1. 导入必要的库 import torch import torch.nn as nn import torchvision import torchvision.transforms as trans…...
在kali linux中kafka的配置和使用
官方文档 一、安装依赖 删除原有的jdk sudo apt remove --purge openjdk-\* sudo apt clean安装 Java (JDK 11) sudo apt install openjdk-11-jdk -y # 验证安装 java -version二、下载并解压 Kafka 下载 Kafka wget https://dlcdn.apache.org/kafka/3.9.0/kafka_2.13-3.9.0.t…...
代码规范和简化标准
代码规范和简化标准是编写高质量、可维护、可扩展和可读代码的基本原则。遵循这些标准不仅能提高团队协作效率,还能减少出错的概率和后期维护的成本。以下是一些常见的代码规范和简化标准: 1. 命名规范 变量命名: 使用具有描述性的名称&…...

基于SpringBoot的校园二手交易平台(源码+论文+部署教程)
运行环境 校园二手交易平台运行环境如下: • 前端:Vue • 后端:Java • IDE工具:IntelliJ IDEA(可自行更换) • 技术栈:SpringBoot Vue MySQL 主要功能 校园二手交易平台主要包含前台和…...
【51单片机】快速入门
动手实践 > 理论空谈!从点亮LED开始,逐步扩展功能,2周可入门基础。 一、51单片机基础概念 什么是51单片机? 基于Intel 8051架构的8位微控制器,广泛用于嵌入式开发。 核心特性:4KB ROM、128B RAM、32个…...
YOLOv8+QT搭建目标检测项目
2024年7月YOLOv8QT初步搭建目标检测(避坑)_qt yolov8-CSDN博客YOLOv8QT初步搭建目标检测 2024年7月YOLOv8QT初步搭建目标检测(避坑)_qt yolov8-CSDN博客 yolov8的可视化界面(一、可视化界面设计)_yolo 可…...

刷题记录10
力扣72. 编辑距离 给你两个单词 word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数 。 你可以对一个单词进行如下三种操作: 插入一个字符删除一个字符替换一个字符 解题思路: 本题与583. 两个字符串的删除操作其实是一样…...

数学软件Matlab下载|支持Win+Mac网盘资源分享
如大家所了解的,Matlab与Maple、Mathematica并称为三大数学软件。Matlab应用广泛,常被用于数据分析、无线通信、深度学习、图像处理与计算机视觉、信号处理、量化金融与风险管理、机器人,控制系统等领域。 Matlab将数值分析、矩阵计算、科学…...

5G学习笔记之BWP
我们只会经历一种人生,我们选择的人生。 参考:《5G NR标准》、《5G无线系统指南:如微见著,赋能数字化时代》 目录 1. 概述2. BWP频域位置3. 初始与专用BWP4. 默认BWP5. 切换BWP 1. 概述 在LTE的设计中,默认所有终端均能处理最大2…...
Spark 介绍
Spark 架构 Spark 是一个基于内存计算的大数据处理框架,相比 Hadoop 的 MapReduce,它能够提供 更高效的迭代计算 和 流式计算能力。Spark 采用 主从架构(Master-Slave),主要包括 Driver、Cluster Manager、Worker、Ex…...
mac Homebrew安装、更新失败
我这边使用brew安装git-lfs 一直报这个错: curl: (35) LibreSSL SSL_connect: SSL_ERROR_SYSCALL更新brew update也是报这个错误。最后使用使用大佬提供的脚本进行操作: /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/mast…...

【实战 ES】实战 Elasticsearch:快速上手与深度实践-2.2.3案例:电商订单日志每秒10万条写入优化
👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 Elasticsearch批量写入性能调优实战:2.2.3 案例:电商订单日志每秒10万条写入优化1. 原始架构与瓶颈分析1.1 初始集群配置1.2 性能瓶颈定位 2. 全链路…...
http的post请求不走http的整个缓存策略吗?
http的post请求不走http的整个缓存策略吗? DeepSeek R1 思考 33 秒 思考过程 嗯,用户问的是HTTP的POST请求是否不遵循整个缓存策略。我需要先回忆一下HTTP缓存的基本机制,然后考虑不同请求方法的缓存处理。 首先,HTTP缓存通常涉…...
c++ 预处理器和iostream 文件
在C中,预处理器和<iostream>头文件各自扮演关键角色,二者协同工作以实现程序的输入输出功能。以下是它们的详细关系和作用: 1. 预处理器的作用 处理预处理指令:预处理器在编译前执行,处理所有以#开头的指令&…...

【前端】前端设计中的响应式设计详解
文章目录 前言一、响应式设计的定义与作用二、响应式设计的原则三、响应式设计的实现四、响应式设计的最佳实践总结 前言 在当今数字化时代,网站和应用程序需要适应各种设备,从桌面电脑到平板电脑和手机。响应式设计应运而生,成为一种可以适…...

探秘基带算法:从原理到5G时代的通信变革【四】Polar 编解码(二)
文章目录 2.3.3 极化编码巴氏参数与信道可靠性比特混合生成矩阵编码举例 2.3.4 极化译码最小单元译码串行抵消译码(SC译码)算法SCL译码算法 2.3.5 总结**Polar 码的优势****Polar 码的主要问题****Polar 码的应用前景** 2.3.6 **参考文档** 本博客为系列…...

打开 Windows Docker Desktop 出现 Docker Engine Stopped 问题
一、关联文章: 1、Docker Desktop 安装使用教程 2、家庭版 Windows 安装 Docker 没有 Hyper-V 问题 3、安装 Windows Docker Desktop - WSL问题 二、问题解析 打开 Docker Desktop 出现问题,如下: Docker Engine Stopped : Docker引擎停止三、解决方法 1、检查服务是否…...
6.人工智能与机器学习
一、人工智能基本原理 1. 人工智能(AI)定义与范畴 核心目标:模拟人类智能行为(如推理、学习、决策)分类: 弱人工智能(Narrow AI):专精单一任务(如AlphaGo、…...
RabbitMQ怎么实现延时支付?
一、使用“死信队列”消息过期时间 1、原理: 设置消息”存活时间“,如果没有被及时消费,就会被丢弃到一个”死信队列“,然后消费者监听这个死信队列处理消息 2、步骤: 2.1、创建两个队列: 2.1.1、普通队…...

前端导出带有合并单元格的列表
// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...

Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...
08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险
C#入门系列【类的基本概念】:开启编程世界的奇妙冒险 嘿,各位编程小白探险家!欢迎来到 C# 的奇幻大陆!今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类!别害怕,跟着我,保准让你轻松搞…...

Qemu arm操作系统开发环境
使用qemu虚拟arm硬件比较合适。 步骤如下: 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载,下载地址:https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...

sshd代码修改banner
sshd服务连接之后会收到字符串: SSH-2.0-OpenSSH_9.5 容易被hacker识别此服务为sshd服务。 是否可以通过修改此banner达到让人无法识别此服务的目的呢? 不能。因为这是写的SSH的协议中的。 也就是协议规定了banner必须这么写。 SSH- 开头,…...

Mysql故障排插与环境优化
前置知识点 最上层是一些客户端和连接服务,包含本 sock 通信和大多数jiyukehuduan/服务端工具实现的TCP/IP通信。主要完成一些简介处理、授权认证、及相关的安全方案等。在该层上引入了线程池的概念,为通过安全认证接入的客户端提供线程。同样在该层上可…...

网页端 js 读取发票里的二维码信息(图片和PDF格式)
起因 为了实现在报销流程中,发票不能重用的限制,发票上传后,希望能读出发票号,并记录发票号已用,下次不再可用于报销。 基于上面的需求,研究了OCR 的方式和读PDF的方式,实际是可行的ÿ…...
大数据驱动企业决策智能化的路径与实践
📝个人主页🌹:慌ZHANG-CSDN博客 🌹🌹期待您的关注 🌹🌹 一、引言:数据驱动的企业竞争力重构 在这个瞬息万变的商业时代,“快者胜”的竞争逻辑愈发明显。企业如何在复杂环…...