c++ 智能指针 简单实现

devtools/2024/11/13 10:09:34/

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三通道改为单通道且保…