编程语言中的特殊类的设计

news2024/9/24 15:16:26

文章目录

  • 不能被拷贝的类
  • 只能在堆上创建对象的类:
    • 方式一
    • 方式二
  • 设计类只能创建栈对象
  • 实现类, 不能被继承
  • 单例模式设计
    • 饿汉模式
    • 懒汉模式
      • 线程安全问题

不能被拷贝的类

c++98 只声明(不生成, 编译器默认会生成, 有浅拷贝等的问题), 不实现, 并将其访问设为private
在这里插入图片描述

c++11使用=delete来限制

只能在堆上创建对象的类:

只能在堆上创建对象的类:

方式一

在这里插入图片描述delete使用会自动调用析构函数, 所以要销毁这个堆对象, 两种方式:
在这里插入图片描述第二种:
在这里插入图片描述

方式二

构造函数私有化, 提供一个函数用于创建对象
在这里插入图片描述
这样的方式并不完整, 利用拷贝构造还是能创建栈对象
在这里插入图片描述
所以这样的方式还要禁止掉拷贝构造函数才完美

HeapOnly(const HeapOnly& ho) = delete;

设计类只能创建栈对象

私有构造函数, 提供一个接口实现:
在这里插入图片描述但是防不住这样的写法:

在这里插入图片描述

这样也不能禁用拷贝构造, 因为在CreateObj中返回局部对象的值要调用拷贝构造,
所以最好的方式是:禁用new 或者是私有化

在这里插入图片描述

实现类, 不能被继承

1.构造函数私有化
在这里插入图片描述
2.c++11final修饰符

在这里插入图片描述

设计模式的概念:被反复使用, 被熟人知晓, 经过分类的, 代码设计经验的总结
(c++是不太关注的, 一般是应用方面比较关注(像Java等语言), 常见的有23种, 这边只细讲单例模式)
迭代器 包装器(适配器)也算设计模式

单例模式设计

思想:对构造函数进行操作

饿汉模式

提前(main函数启动前)准备好,随时getinsert
在类内创建一个该类的对象(此时不允许, 不允许这样的方式来声明), 并且把这个类的对象设为static, 静态的不在对象里面.
这个对象的内存属于静态区, 访问权限属于private, 属于是类内的成员, 此时是属于声明, 定义需要使用类外定义

在这里插入图片描述
他的对象获取就需要使用这个方式

在这里插入图片描述同时要禁用拷贝构造和赋值构造:

完整代码及演示

class A
{
public:
	static A* GetInsert()
	{
		return &_inst;
	}
	void Add(const string& s1, const string& s2)
	{
		_dict[s1] = s2;
	}
	void Print()
	{
		for (auto& e : _dict)
		{
			cout << e.first << ":" << e.second << endl;
		}
	}
private:
	A() {}
	A(const A& a) = delete;
	A& operator=(const A& a) = delete;
	map<string, string> _dict;
	static A _inst;//先声明
};
A A::_inst;//定义
int main()
{
	A::GetInsert()->Add("sort", "排序");
	A::GetInsert()->Add("right", "向右");
	A::GetInsert()->Add("left", "向左");
	
	A::GetInsert()->Print();

	return 0;
}

结果演示
在这里插入图片描述

优点:
相比懒汉模式, 实现简单, 线程安全
缺点:
可能导致进程启动慢, 创建的单例对象首先会初始化很多
如果两个单例有启动先后顺序, 饿汉模式下无法控制
(导致问题的本质都是对象在main函数之前创建的有关)

懒汉模式

第一次用的时候再去创建(现吃现做)
与上述大致一致, 指向对象的指针初始化为nullptr
在类内构造的接口函数:

在这里插入图片描述
其他无异:


class B
{
public:
	static B* GetInstance()
	{
		if (_inst == nullptr)
		{
			_inst = new B;
		}

		return _inst;
	}
	void Add(const string& s1, const string& s2)
	{
		_dict[s1] = s2;
	}
	void Print()
	{
		for (auto& e : _dict)
		{
			cout << e.first << ":" << e.second << endl;
		}
	}
private:
	B() {}
	B(const B& a) = delete;
	B& operator=(const B& a) = delete;
	map<string, string> _dict;
	static B* _inst;//先声明
};
B* B::_inst = nullptr;//定义
int main()
{
	B::GetInstance()->Add("sort", "排序");
	B::GetInstance()->Add("right", "向右");
	B::GetInstance()->Add("left", "向左");
	
	B::GetInstance()->Print();

	return 0;
}

结果演示:
在这里插入图片描述
懒汉模式下new出来的对象一般不需要进行释放, 进程正常退出会释放资源
但是终有万一: 有的操作下是在析构函数要把数据写入文件,期望是main函数结束自动调用
所以使用 :
1.智能指针
2.内部类(内部类是外部类的友元)
这边演示2 :
在这里插入图片描述
在这里插入图片描述

线程安全问题

对于懒汉模式, 当有两个线程同时第一个使用, 创建这个对象就有线程安全问题

在这里插入图片描述

单例模式最简单的写法:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

欢迎随时来进行交流~~~

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

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

相关文章

Python数据可视化库之bqplot使用详解

概要 在数据科学和机器学习领域,数据可视化是理解和分析数据的重要工具。bqplot 是一个基于 Jupyter Notebook 的 Python 可视化库,专注于交互式数据可视化。它结合了 D3.js 的强大功能和 Python 的易用性,使用户能够在 Jupyter 环境中创建丰富的交互式图表。bqplot 的设计…

如何使用GPT画出带中文的图和表?-已解决GPT画图表出现乱码的问题

众所周知&#xff0c;GPT的中文库有点问题&#xff0c;要求他画带中文的图或表存在中文的时候&#xff0c;就会出现乱码或者方框。 可以发现&#xff0c;GPT的中文库有问题&#xff0c;那么该如何解决这个问题呢&#xff1f; 直接在promote的时候上传你需要它使用的字体&…

高斯混合模型GMM

一、两个角度看GMM 1、从几何角度来看&#xff1a;加权平均值&#xff0c;多个高斯分布叠加而成 纵轴——f&#xff08;x&#xff09;概率密度函数&#xff0c;横轴——数据点 2、从混合模型角度看 x:observed variable z:latent variable →对应的样本是属于哪一个高斯分布&…

【SQL】筛选上级经理离职的员工

目录 题目 分析 代码 题目 表: Employees ----------------------- | Column Name | Type | ----------------------- | employee_id | int | | name | varchar | | manager_id | int | | salary | int | ----------------------- 在 SQ…

word文档合并样式问题

word协同工作时&#xff0c;在mac用office编辑后发送给对方进行合并时&#xff0c;出现了一些不该看到的样式。 需要注意的几点&#xff1a; 1、大家均需要使用同样的软件&#xff0c;如office&#xff0c;如果使用wps&#xff0c;会导致新增很多样式。 2、在样式窗格&#…

gitlab SSH的使用

一、 安装git bash https://git-scm.com/download/win 下载windows 版本&#xff0c;默认安装即可。 二、使用命令 打开本地git bash,使用如下命令生成ssh公钥和私钥对 ssh-keygen -t rsa -C ‘xxxxxx.com’ 然后一路回车 (-C 参数是你的邮箱地址) 若是想输入密码可以输入…

浅谈线性表——栈

文章目录 一、什么是栈&#xff1f;二、栈顺序、链式存储时的时间复杂度三、自我实现一个栈3.1、实现代码3.2、熟练使用栈 四、栈的应用场景4.1、不可能的出栈顺序4.2、表达式4.2、OJ题 一、什么是栈&#xff1f; 栈是一种特殊的线性表&#xff0c;他只允许在固定的一端进行插…

直播美颜API与视频美颜SDK的开发指南:构建高效实时美颜工具

在主播美颜的背后&#xff0c;直播美颜API与视频美颜SDK是实现这一切的技术核心。接下来&#xff0c;小编将深入讲解如何开发高效的直播美颜API与视频美颜SDK。 一、视频美颜SDK的概述 视频美颜SDK则是一个开发工具包&#xff0c;提供了完整的美颜功能实现&#xff0c;开发者…

STM32(F103ZET6)第四课:串口中断

目录 需求一、串口中断过程与作用二、中断实现流程1.中断优先级分组2.配置串口中断 三、需求的实现 需求 1.设备上电后四个灯灭。 2.按下KEY1&#xff0c;LED1灯亮&#xff0c;同时串口发送“LED1灯亮”。 3.再次按下KEY1&#xff0c;LED1灯灭&#xff0c;同时串口发送“LED1灯…

大数据计算-SQL优化手段(CBO)-以Flink为例

文章目录 背景理论知识示例结果展示结果解释 背景 大数据计算中&#xff0c;SQL生成的执行计划第一轮会经过固定规则的优化&#xff0c;第二轮会根据原计划&#xff0c;生成多条结合成本的的执行计划&#xff0c;根据cost 进行排序&#xff0c;选出最优的执行计划。 理论知识…

深入调研亚马逊云科技AI平台Amazon Bedrock热门开发功能

国际数据公司&#xff08;IDC&#xff09;在2024 年 8 月发布了《 中国大模型平台市场份额&#xff0c; 2023 &#xff1a;大模型元年——初局 》调研报告 。IDC的数据显示&#xff0c;2023年中国大模型平台及相关应用市场规模达惊人的17.65亿元人民币&#xff0c;且科学计算大…

带有音频的ppt导出视频 带有音频的ppt自动播放

之前帮导师申请基金&#xff0c;基金委的要求是提交ppt的讲解视频&#xff0c;这个需求比较容易实现。只要提前把各页的音频录制好&#xff0c;插入对应页&#xff0c;然后直接选择导出-创建视频即可&#xff0c;不需要设置幻灯片自动切换&#xff0c;以及自动换片时间&#xf…

C++ 设计模式——享元模式

C 设计模式——享元模式 C 设计模式——享元模式1. 主要组成成分2. 享元模式内部状态3. 享元模式外部状态4. 逐步构建享元模式4.1 抽象享元类定义4.2 具体享元类实现4.3 享元工厂类实现4.4 主函数 5. 享元模式 UML 图享元模式 UML 图解析 6. 享元模式的优点7. 享元模式的缺点8.…

TMDOG的微服务之路_07——初入微服务,NestJS微服务快速入门

TMDOG的微服务之路_07——初入微服务&#xff0c;NestJS微服务快速入门 博客地址&#xff1a;TMDOG的博客 在前几篇博客中&#xff0c;我们探讨了如何在 NestJS 中的一些基础功能&#xff0c;并可以使用NestJS实现一个简单的单体架构后端应用。本篇博客&#xff0c;我们将进入…

Python 如何进行简单的 GUI 编程(Tkinter)

图形用户界面&#xff08;GUI&#xff09;编程是指使用窗口、按钮、文本框等元素与用户进行交互的编程方式。在Python中&#xff0c;Tkinter是一个非常流行的标准库&#xff0c;它使得我们可以轻松地创建和管理图形用户界面。 Tkinter是Python内置的GUI库&#xff0c;它提供了…

Datawhale X 李宏毅苹果书 AI夏令营(深度学习进阶)task1(1.1+1.2)

深度学习的基础 常见的临界点的种类为局部最小值和鞍点 task1.1 1.局部最小值 对于任何目标函数f(x)&#xff0c;如果在x处对应的f(x)值小于在x附近任意其他点的f(x)值&#xff0c;那么f(x)可能是局部最小值。如果f(x)在x处的值是整个域中目标函数的最小值&#xff0c;那么…

爬虫中使用第三方打码平台(识别验证码)

引入 在爬虫程序中,常常会遇到验证码校验的关卡,人工识别不仅慢而且很费精力,使用打码平台就成了高效,省时且便利的选择。 本次案例对于高清资源库1080zyk.com进行爬虫采集&#xff0c;使用超级鹰验证码识别(chaojiying.com)和python的requests库具体实现&#xff0c;类似的第…

CSS的动画效果

动画效果 语法&#xff1a; 创建动画&#xff1a;keyframes 调用动画&#xff1a;animation animation参数值 参数值效果animation-name规定 keyframes 动画的名称。animation-duration规定动画完成一个周期所花费的秒或毫秒。默认是 0animation-timing-function规定动画的速…

ZBrush入门使用介绍——11、边缘环

大家好&#xff0c;我是阿赵。   继续介绍ZBrush的用法。这次看看边缘环的使用方法。我个人的感觉&#xff0c;边缘环有点类似于3DsMax之类软件的挤出功能&#xff0c;可以沿着环形的面&#xff0c;添加凹凸效果。   边缘环工具入口在几何体编辑里面&#xff1a; 一、 边…

AI大语言模型之分布式训练概述

一、前言 随着语言模型参数量和所需训练数据量的急速增长&#xff0c;单个机器上有限的资源已无法满足大语言模型训练的要求。需要设计分布式训练&#xff08;Distributed Training&#xff09;系统来解决海量的计算和内存资源需求问题。 在分布式训练系统环境下需要将一个模…