c++ 智能指针 简单实现

devtools/2024/9/19 19:20:13/ 标签: 智能指针, c++, 简单实验

1.需要设计

智能指针实现,目标用一个对象管理指针。
指针类:B
智能指针类A<T>
A<B> a(new B);
用A来管理B的指针,如果有多个指针指向一个对象,那么都用A来承载这个指针
A<B> b(a);
这里需要一个拷贝构造函数,为什么不用赋值运算符的,两个智能指针赋值将不会有任何价值,所以重载赋值运算符没有任何意义,这里通过拷贝构造函数来实现一个新的指针的产生。

经历上面的智能指针拷贝构造后,会产生多个指针指向同一个对象的情况,如果一个对象删除了,就会出现指针悬垂的情况。这里添加一个delet_c函数来控制指针的删除,另外因为智能指针对象的创建是创建在栈上,为了借用堆对象析构时候对指针的控制,这里在析构函数也做了控制,这里为了模拟对象析构的过程,也用一个函数模拟了"delete 指针"的行为。

2.代码

#include <iostream>
using namespace std;namespace T1 {//智能运算符重载,智能指针的基础class  B{public:void fun() {cout << "fun\n";}};template<class T>class  A{public:void set(T* t) {this->t = t;}/// <summary>/// 重载运算符,智能指针的基础/// </summary>/// <returns></returns>T* operator->() {return t;}T* t;};void main() {A<B> pa;pa.set(new B());pa->fun();}
}
namespace T2 {//用构造函数和析构函数控制指针的生命周期class  B{public:void fun() {cout << "fun\n";}};template<class T>class  A{public:/// <summary>/// 用构造函数控制指针的生命周期/// </summary>/// <param name="t"></param>A(T* t) {this->t = t;}/// <summary>/// 析构函数,释放奶茶/// </summary>~A() {delete t;}T* operator->() {return t;}T* t;};void main() {A<B> pa(new B());pa->fun();}
}
namespace T3 {class  B{public:void fun() {cout << "fun\n";}};template<class T>class  A{public:A(T* t) {this->t = t;//创建一个堆中的内存tsum = new int(0);}/// <summary>/// 用拷贝构造函数,控制指针被拷贝的次数/// </summary>/// <param name="object"></param>A(const A<T>& object) {this->t = object.t;this->tsum = object.tsum;(*tsum)++;}~A() {//如果之前进行过指针的释放了,那么这里不需要释放了if (isdelet) {return;}delete t;}T* operator->() {return t;}T* t;int* tsum;void delete_t() {//t == NULL:防止以外的delete//isdelet==true:一个指针如果释放过一次,就不需要再次释放了if (t == NULL|| isdelet==true) {return;}//执行过指针释放了,那么析构函数的时候就不需要释放指针了isdelet = true;if (*tsum > 0) {(*tsum)--;}else{delete t;t == NULL;}}private://释放释放过bool isdelet = false;//对于单纯的指针,赋值没有任何意义A& operator =(const A& a) = delete;/*A& operator =(const A& a) {//t = a.t;return *this;}*/};void main() {A<B> pa(new B());A<B> pb(pa);//A<B> pc(pb);pa->fun();//pa = pb;pa.delete_t();pb.delete_t();}
}
int main()
{//T1::main();//T2::main();T3::main();cout << "Hello World!\n";
}

3.运行结果

fun
Hello World!


http://www.ppmy.cn/devtools/19331.html

相关文章

嵌入式物联网实战开发笔记-乐鑫ESP32芯片功能对比以及功能选型【doc.yotill.com】

乐鑫ESP32入门到精通项目开发参考百例下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1ATvRnAZvxkev-PJfd3EAPg?pwd4e33 提取码&#xff1a;4e33 2.1 初识 ESP32 ESP32-S3 是一款低功耗的 MCU 系统级芯片 (SoC)&#xff0c;支持 2.4 GHz Wi-Fi 和低功耗蓝牙 (…

并并并并·病查坤

P1、什么是并查集 引用自百度百科&#xff1a; 并查集&#xff0c;在一些有N个元素的集合应用问题中&#xff0c;我们通常是在开始时让每个元素构成一个单元素的集合&#xff0c;然后按一定顺序将属于同一组的元素所在的集合合并&#xff0c;其间要反复查找一个元素在哪个集合…

go中标签创建与引用

go中tag维护方法 util项目&#xff1a; 0 util修改的代码提交 1 从gitlab上获取最新的tag https://git.****.com/peiyou_like_shuangshi_zhongtai/beibo_utils/tags 2 创建tag: git tag -a v1.101.11 -m "its的ggb查询" 3 tagpush&#xff1a;git push origin v1.10…

玄子Share-Shell编程之条件语句

玄子Share-Shell编程之条件语句 条件测试操作 test命令 测试表达式是否成立&#xff0c;若成立返回0&#xff0c;否则返回其他数值 格式1&#xff1a;test 条件表达式 格式2&#xff1a;[ 条件表达式 ] # 至少应有一个空格文件测试 [ 操作符 文件或目录 ][rootlocal…

状态模式:管理状态转换的策略

在软件设计中&#xff0c;某些对象在其生命周期内会有不同的状态&#xff0c;并且这些状态之间可以相互转换。状态模式&#xff08;State Pattern&#xff09;是一种行为型设计模式&#xff0c;它允许一个对象在其内部状态改变时改变其行为。这个模式将各种状态转移逻辑封装在独…

村庄集中式生活废水处理设备技术工艺

诸城市鑫淼环保小编带大家了解一下村庄集中式生活废水处理设备技术工艺 工艺&#xff1a; 生物接触氧化法指由浸没在污水中的填料和曝气系统构成的污水处理方法&#xff0c;在有氧条件下&#xff0c;污水与填料表面的生物膜广泛接触&#xff0c;使污水得到净化。填料指在污水处…

ollama集成open-webui本地部署大模型应用

文章目录 概述安装ollama运行指定模型命令帮助docker 安装 webuiWebUI与ollama在同一台机器WebUI与ollama不在同一台机器(推荐)更新open-webui离线安装open-webui使用验证访问导入模型文件参考资料概述 ollama是一款在本地启动并运行大型语言模型的工具,主要功能是在 Docke…

c++ opencv

文章目录 错误1. C2039 "channels": 不是 "cv::DataType<_Tp>" 的成员2. 注意cv::mat的类型3. cv::mat求inv4. vector subscript out of range5. 使用determinant求行列式注意点 其他1.Vec3b的赋值与访问2. cv::mean3. 将cv::mat三通道改为单通道且保…

第二章:计算机系统基础知识之计算机网络

计算机网络 计算机网络是利用通信线路将地理上分散的、具有独立功能的计算机系统和通信设备按不同的形式连接起来&#xff0c;并依靠网络软件及通信协议实现资源共享和信息传递的系统。   计算机网络技术主要涵盖通信技术、网络技术、组网技术和网络工程等四个方面。 计算机…

安装 wsl-ubuntu 24.04

安装 wsl-ubuntu 24.04 1. 安装 Ubuntu-24.042. (可选)配置阿里云软件源3. 系统更新 1. 安装 Ubuntu-24.04 安装 Ubuntu-24.04&#xff0c;默认会安装在 C 盘&#xff0c; wsl --install -d Ubuntu-24.04导出 Ubuntu-24.04&#xff0c; wsl --export Ubuntu-24.04 D:\tmp\Ub…

Mac如何更换终端默认的python版本

一、Mac中如何更换终端默认的python版本 1、打开终端输入下列代码&#xff0c;打开配置文件 open ~/.bash_profile 2.在打开的配置文件中输入&#xff08;以下代码3.12替换为所下载的版本即可&#xff09; #下面是修改python版本的命令就是环境变量 export PYTHON_HOME/Lib…

深拷贝与浅拷贝-附深拷贝工具类

深拷贝与浅拷贝的区别 浅拷贝只是拷贝了源对象的地址&#xff0c;所以当源对象发生改变时&#xff0c;拷贝的对象的值也会对应发生改变。 深拷贝则是拷贝了源对象的所有值&#xff0c;而不是地址&#xff0c;所以深拷贝对象中的值不会随着源对象中的值的改变而改变。 浅拷贝只是…

【java毕业设计】 基于Spring Boot+mysql的高校心理教育辅导系统设计与实现(程序源码)-高校心理教育辅导系统

基于Spring Bootmysql的高校心理教育辅导系统设计与实现&#xff08;程序源码毕业论文&#xff09; 大家好&#xff0c;今天给大家介绍基于Spring Bootmysql的高校心理教育辅导系统设计与实现&#xff0c;本论文只截取部分文章重点&#xff0c;文章末尾附有本毕业设计完整源码及…

pnpm 安装后 node_modules 是什么结构?为什么 webpack 不识别 pnpm 安装的包?

本篇研究&#xff1a;使用 pnpm 安装依赖时&#xff0c;node_modules 下是什么结构 回顾 npm3 之前&#xff1a;依赖树 缺点&#xff1a; frequently packages were creating too deep dependency trees, which caused long directory paths issue on Windowspackages were c…

【机器学习】农田智能监控系统的实践探索

机器学习赋能现代农业&#xff1a;农田智能监控系统的实践探索 一、机器学习在现代农业中的重要作用二、机器学习在农田智能监控系统中的应用三、农田智能监控系统的实践意义 在科技飞速发展的今天&#xff0c;机器学习技术正以其强大的数据处理和模式识别能力&#xff0c;逐步…

如何有效的将丢失的mfc140u.dll修复,几种mfc140u.dll丢失的解决方法

当你在运行某个程序或应用程序时&#xff0c;突然遭遇到mfc140u.dll丢失的错误提示&#xff0c;这可能会对你的电脑运行产生一些不利影响。但是&#xff0c;不要担心&#xff0c;以下是一套详细的mfc140u.dll丢失的解决方法。 mfc140u.dll缺失问题的详细解决步骤 步骤1&#x…

SV-7041T IP网络有源音箱 教室广播多媒体音箱(带本地扩音功能)教学广播音箱 办公室背景音乐广播音箱 2.0声道壁挂式网络有源音箱

SV-7041T IP网络有源音箱 教室广播多媒体音箱&#xff08;带本地扩音功能&#xff09; 教学广播音箱 办公室背景音乐广播音箱 一、描述 SV-7041T是深圳锐科达电子有限公司的一款2.0声道壁挂式网络有源音箱&#xff0c;具有10/100M以太网接口&#xff0c;可将网络音源通过自带…

DSP开发实战教程-国产DSP替代进口TI DSP的使用技巧

1.替换CCS安装路径下的Flash.out文件 找到各自CCS的安装路径&#xff1a; D:\ti\ccs1230\ccs\ccs_base\c2000\flashAlgorithms 复制进芯电子国产DSP官网提供的配置文件 下载链接&#xff1a;https://mp.csdn.net/mp_download/manage/download/UpDetailed 2.替换原有文件 3.…

MATLAB初学者入门(14)—— 支持向量机

支持向量机&#xff08;SVM&#xff09;是一种强大的分类技术&#xff0c;用于解决分类和回归问题。它工作原理是找到最优的超平面&#xff0c;该超平面能够最大化不同类别数据点之间的边界。MATLAB提供了一个简单易用的工具箱&#xff0c;称为Statistics and Machine Learning…

在Linux系统内搭建DNS本地服务器

文章目录 Linux的本地DNS服务一、什么是DNS1.1、域名1.2、DNS服务器、DNS客户端和DNS中继1.3、DNS域名解析 二、搭建DNS服务2.1、正反向解析2.1.1.安装bind软件包2.1.2.修改主配置文件2.1.3.修改区域配置文件2.1.4.配置区域数据文件2.1.5.启动服务、关闭防火墙2.1.6.本地解析测…