当前位置: 首页 > news >正文

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++-第二十一章:特殊类设计

目录 第一节&#xff1a;特殊类 1-1.不能被拷贝的类 1-2.只能在堆上构造的类 1-3.只能在栈上构造的类 1-4.只能构造一个对象的类 第二节&#xff1a;工厂模式 下期预告&#xff1a; 第一节&#xff1a;特殊类 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…...

代码规范和简化标准

代码规范和简化标准是编写高质量、可维护、可扩展和可读代码的基本原则。遵循这些标准不仅能提高团队协作效率&#xff0c;还能减少出错的概率和后期维护的成本。以下是一些常见的代码规范和简化标准&#xff1a; 1. 命名规范 变量命名&#xff1a; 使用具有描述性的名称&…...

基于SpringBoot的校园二手交易平台(源码+论文+部署教程)

运行环境 校园二手交易平台运行环境如下&#xff1a; • 前端&#xff1a;Vue • 后端&#xff1a;Java • IDE工具&#xff1a;IntelliJ IDEA&#xff08;可自行更换&#xff09; • 技术栈&#xff1a;SpringBoot Vue MySQL 主要功能 校园二手交易平台主要包含前台和…...

【51单片机】快速入门

动手实践 > 理论空谈&#xff01;从点亮LED开始&#xff0c;逐步扩展功能&#xff0c;2周可入门基础。 一、51单片机基础概念 什么是51单片机&#xff1f; 基于Intel 8051架构的8位微控制器&#xff0c;广泛用于嵌入式开发。 核心特性&#xff1a;4KB ROM、128B RAM、32个…...

YOLOv8+QT搭建目标检测项目

2024年7月YOLOv8QT初步搭建目标检测&#xff08;避坑&#xff09;_qt yolov8-CSDN博客YOLOv8QT初步搭建目标检测 2024年7月YOLOv8QT初步搭建目标检测&#xff08;避坑&#xff09;_qt yolov8-CSDN博客 yolov8的可视化界面&#xff08;一、可视化界面设计&#xff09;_yolo 可…...

刷题记录10

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

数学软件Matlab下载|支持Win+Mac网盘资源分享

如大家所了解的&#xff0c;Matlab与Maple、Mathematica并称为三大数学软件。Matlab应用广泛&#xff0c;常被用于数据分析、无线通信、深度学习、图像处理与计算机视觉、信号处理、量化金融与风险管理、机器人&#xff0c;控制系统等领域。 Matlab将数值分析、矩阵计算、科学…...

5G学习笔记之BWP

我们只会经历一种人生&#xff0c;我们选择的人生。 参考&#xff1a;《5G NR标准》、《5G无线系统指南:如微见著&#xff0c;赋能数字化时代》 目录 1. 概述2. BWP频域位置3. 初始与专用BWP4. 默认BWP5. 切换BWP 1. 概述 在LTE的设计中&#xff0c;默认所有终端均能处理最大2…...

Spark 介绍

Spark 架构 Spark 是一个基于内存计算的大数据处理框架&#xff0c;相比 Hadoop 的 MapReduce&#xff0c;它能够提供 更高效的迭代计算 和 流式计算能力。Spark 采用 主从架构&#xff08;Master-Slave&#xff09;&#xff0c;主要包括 Driver、Cluster Manager、Worker、Ex…...

mac Homebrew安装、更新失败

我这边使用brew安装git-lfs 一直报这个错&#xff1a; curl: (35) LibreSSL SSL_connect: SSL_ERROR_SYSCALL更新brew update也是报这个错误。最后使用使用大佬提供的脚本进行操作&#xff1a; /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/mast…...

【实战 ES】实战 Elasticsearch:快速上手与深度实践-2.2.3案例:电商订单日志每秒10万条写入优化

&#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 文章大纲 Elasticsearch批量写入性能调优实战&#xff1a;2.2.3 案例&#xff1a;电商订单日志每秒10万条写入优化1. 原始架构与瓶颈分析1.1 初始集群配置1.2 性能瓶颈定位 2. 全链路…...

http的post请求不走http的整个缓存策略吗?

http的post请求不走http的整个缓存策略吗&#xff1f; DeepSeek R1 思考 33 秒 思考过程 嗯&#xff0c;用户问的是HTTP的POST请求是否不遵循整个缓存策略。我需要先回忆一下HTTP缓存的基本机制&#xff0c;然后考虑不同请求方法的缓存处理。 首先&#xff0c;HTTP缓存通常涉…...

c++ 预处理器和iostream 文件

在C中&#xff0c;预处理器和<iostream>头文件各自扮演关键角色&#xff0c;二者协同工作以实现程序的输入输出功能。以下是它们的详细关系和作用&#xff1a; 1. 预处理器的作用 处理预处理指令&#xff1a;预处理器在编译前执行&#xff0c;处理所有以#开头的指令&…...

【前端】前端设计中的响应式设计详解

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

探秘基带算法:从原理到5G时代的通信变革【四】Polar 编解码(二)

文章目录 2.3.3 极化编码巴氏参数与信道可靠性比特混合生成矩阵编码举例 2.3.4 极化译码最小单元译码串行抵消译码&#xff08;SC译码&#xff09;算法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. 人工智能&#xff08;AI&#xff09;定义与范畴 核心目标&#xff1a;模拟人类智能行为&#xff08;如推理、学习、决策&#xff09;分类&#xff1a; 弱人工智能&#xff08;Narrow AI&#xff09;&#xff1a;专精单一任务&#xff08;如AlphaGo、…...

RabbitMQ怎么实现延时支付?

一、使用“死信队列”消息过期时间 1、原理&#xff1a; 设置消息”存活时间“&#xff0c;如果没有被及时消费&#xff0c;就会被丢弃到一个”死信队列“&#xff0c;然后消费者监听这个死信队列处理消息 2、步骤&#xff1a; 2.1、创建两个队列&#xff1a; 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 解锁大语言模型的潜力

引言&#xff1a; 在人工智能快速发展的浪潮中&#xff0c;快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型&#xff08;LLM&#xff09;。该模型代表着该领域的重大突破&#xff0c;通过独特方式融合思考与非思考…...

Cinnamon修改面板小工具图标

Cinnamon开始菜单-CSDN博客 设置模块都是做好的&#xff0c;比GNOME简单得多&#xff01; 在 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&#xff08;位图&#xff09;是Android应用内存占用的“头号杀手”。一张1080P&#xff08;1920x1080&#xff09;的图片以ARGB_8888格式加载时&#xff0c;内存占用高达8MB&#xff08;192010804字节&#xff09;。据统计&#xff0c;超过60%的应用OOM崩溃与Bitm…...

08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险

C#入门系列【类的基本概念】&#xff1a;开启编程世界的奇妙冒险 嘿&#xff0c;各位编程小白探险家&#xff01;欢迎来到 C# 的奇幻大陆&#xff01;今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类&#xff01;别害怕&#xff0c;跟着我&#xff0c;保准让你轻松搞…...

Qemu arm操作系统开发环境

使用qemu虚拟arm硬件比较合适。 步骤如下&#xff1a; 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载&#xff0c;下载地址&#xff1a;https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...

sshd代码修改banner

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

Mysql故障排插与环境优化

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

网页端 js 读取发票里的二维码信息(图片和PDF格式)

起因 为了实现在报销流程中&#xff0c;发票不能重用的限制&#xff0c;发票上传后&#xff0c;希望能读出发票号&#xff0c;并记录发票号已用&#xff0c;下次不再可用于报销。 基于上面的需求&#xff0c;研究了OCR 的方式和读PDF的方式&#xff0c;实际是可行的&#xff…...

大数据驱动企业决策智能化的路径与实践

&#x1f4dd;个人主页&#x1f339;&#xff1a;慌ZHANG-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 一、引言&#xff1a;数据驱动的企业竞争力重构 在这个瞬息万变的商业时代&#xff0c;“快者胜”的竞争逻辑愈发明显。企业如何在复杂环…...