波奇C++11:智能指针(三)特殊类的设计和单例模式

智能指针除了创建普通对象还有以下用法

std::shared_ptr<Test> sp1(new Test[2]); // 数组
std::shared_ptr<Test> sp2((Test*)malloc(sizeof(Test))); //malloc开辟空间
std::shared_ptr<FILE> sp3(fopen("源.cpp", "r")); // 文件管理

此时原本的析构的函数可能无法发挥作用。 

~SharedPtr(){if (--(*_pcount) == 0){cout << "delete pointer" << _ptr << endl;delete _ptr;delete _pcount;}else{cout << *_pcount << endl;}}

C++支持shared_ptr 定制删除器,即手动传递构造函数。

template<class T>
struct DeleteArray
{void operator()(T* ptr){delete[] ptr;}
};
std::shared_ptr<Test> sp1(new Test[2],DeleteArray<Test>());
std::shared_ptr<Test> sp2((Test*)malloc(sizeof(Test)), [](Test* sp) {free(sp); });
std::shared_ptr<FILE> sp3(fopen("源.cpp", "r"), [](FILE* sp) {fclose(sp); });

 用function<void(T*)> 来接收可调用对象类型。

template<class T>
class SharedPtr
{
public://添加模板类型,接收可调用对象template<class D>SharedPtr(T* ptr,D del):_ptr(ptr),_pcount(new int(1)),_del(del){}~SharedPtr(){if (--(*_pcount) == 0){cout << "delete pointer" << _ptr << endl;_del(_ptr); //调用delete _pcount;}else{cout << *_pcount << endl;}}
//.......
private:T* _ptr;int* _pcount;// 不能直接用D定义类型,用function来接收可调用对象function<void(T*)> _del=[](T* ptr){delete ptr;};
};

 特殊类的设计

不能被拷贝的类

class CopyBan
{// ...CopyBan(const CopyBan&)=delete;CopyBan& operator=(const CopyBan&)=delete;//...
};

只能在堆上创建

class HeapOnly    
{     
public:     static HeapOnly* CreateObject()  {      return new HeapOnly;    }
private:    HeapOnly() {}// C++11   防止 HeapOnly hp(*hptr);HeapOnly(const HeapOnly& hp) = delete;HeapOnly& operator()(const HeapOnly& hp)=delete;
};

只能在栈上创建的对象

class StackOnly
{
public:static StackOnly CreateObj(){return StackOnly();}// 禁掉operator new可以把下面用new 调用拷贝构造申请对象给禁掉// StackOnly obj = StackOnly::CreateObj();// StackOnly* ptr3 = new StackOnly(obj); //调用拷贝构造void* operator new(size_t size) = delete;void operator delete(void* p) = delete;
private:StackOnly()  :_a(0){}int _a;
};

不能被继承的类

class A  final
{// ....
};

单例模式:全局只能创建一个对象

1.构造函数私有化

2.防止拷贝

3.提供获取单例的接口和其他函数 

饿汉模式 

class Singleton
{
public://获取单例对象的接口static Singleton& GetInstance(){return _sinst;}void test(){cout << 1;}
private:// 构造函数私有Singleton(){}// 防止拷贝Singleton(const Singleton& s) = delete;Singleton& operator()(const Singleton& s) = delete;map<string, string> _dict;static Singleton _sinst; //唯一的单例定义在类部
};
Singleton Singleton::_sinst;
int main()
{// 调用Singleton::GetInstance().test();return 0;
}

上面饿汉模式:在main函数之前创建单例对象

存在问题:单例对象初始化内容多,影响启动速度。两个单例类有依赖关系

 懒汉模式:在main函数后创建对象

class Singleton
{
public://获取单例对象的接口static Singleton& GetInstance(){//第一次调用时才创建对象if(!_psinst){_psinst=new Singleton;}return *_psinst;}void test(){cout << 1;}
private:// 构造函数私有Singleton(){}// 防止拷贝Singleton(const Singleton& s) = delete;Singleton& operator()(const Singleton& s) = delete;map<string, string> _dict;static Singleton* _psinst; //唯一的单例定义在类部
};
Singleton* Singleton::_psinst=nullptr;

单例显性释放

static void DelInstance(){if(_psinst){delete _psinst;_psinst=nullptr;}}

 

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

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

相关文章

【UE5】使用场系统炸毁一堵墙

效果 步骤 1. 新建一个空白项目 2. 新建一个Basic关卡&#xff0c;然后添加一个第三人称游戏和初学者内容包到内容浏览器 3. 在场景中添加一堵墙 4. 选项模式选择“破裂” 点击新建 新建一个文件夹用于存储几何体集 点击“统一” 最小和最大Voronoi点数都设置为100 点击“破…

【组合数学】排列组合

目录 1. 加法乘法原理加法原理乘法原理 2. 排列&组合集合排列集合组合 3. 多重集合的排列 & 组合多重集合的排列多重集合的组合 4. 二项式定理5. 集合的划分&#xff08;Stirling&#xff09; 1. 加法乘法原理 加法原理 计算在一系列互斥事件中任意一个事件发生的总数…

cmd查看进程信息 终止进程

cmd查看进程信息 终止进程 1、cmd查看进程信息2、终止进程 1、cmd查看进程信息 tasklist命令 描述: 该工具显示在本地或远程机器上当前运行的进程列表。 tasklist /?查看本机所有进程列表 tasklist /V根据进程名 查看jmeter进程 tasklist /V |findstr /i jmeter2、终止进程…

1+x网络系统建设与运维(中级)-练习3

一.设备命名 AR1 [Huawei]sysn AR1 [AR1] 同理可得&#xff0c;所有设备的命名如上图所示 二.VLAN LSW1 [LSW1]vlan 10 [LSW1-vlan10]q [LSW1]int g0/0/1 [LSW1-GigabitEthernet0/0/1]port link-type access [LSW1-GigabitEthernet0/0/1]port default vlan 10 [LSW1-GigabitEt…

【自用数据结构】—将链表中的奇数全部移动到偶数前面

void move(LNode*& L){ LNode* pL; while(p!null){ if((p->next->data)%21) //判断该元素是否为奇函数 LNode *s p->next; p->nexts->next; s->nextL->next; L->nexts; else pp->next; } }

避免20种常见Selenium自动化测试异常,让你的测试更加稳定和可靠!

常见的Selenium异常 以下是所有Selenium WebDriver代码中可能发生的一些常见Selenium异常。 1、ElementClickInterceptedException 由于以某种方式隐藏了接收到click命令的元素&#xff0c;因此无法正确执行Element Click命令。 2、ElementNotInteractableException 即使目…

【Qt开发流程】之事件过滤器及sendEvent和postEvent

描述 事件过滤器(Event Filter)是Qt中一个强大的事件处理机制&#xff0c;它可以在对象接收到事件之前截获事件&#xff0c;并进行自定义处理。事件过滤器可以在不修改对象自身代码的前提下&#xff0c;对其进行事件处理和拦截。 事件过滤器的使用过程如下&#xff1a; 创建一…

Spring常用注解

1、给容器中注入组件-交由spring管理 Component&#xff1a;泛指各种组件&#xff0c;用于将当前类对象存入Spring容器中 Controller&#xff1a;用在控制层 Service&#xff1a;用在业务层 Repository&#xff1a;用在数据访问层 Bean&#xff1a;导入第三方包里面的注解…

C++ 文件操作之配置文件读取

C 文件操作之配置文件读取 在项目应用时常常会涉及一些调参工作&#xff0c;如果项目封装成了.exe或者.dll&#xff0c;那么频繁调参多次编译是一件十分低效的事情&#xff0c;如果代码算法或者逻辑是一定的&#xff0c;那么参数完全可以通过读入配置文件来获取之前在用C - op…

界面组件DevExpress Reporting v23.1新版亮点 - UX功能增强

DevExpress Reporting是.NET Framework下功能完善的报表平台&#xff0c;它附带了易于使用的Visual Studio报表设计器和丰富的报表控件集&#xff0c;包括数据透视表、图表&#xff0c;因此您可以构建无与伦比、信息清晰的报表 界面组件DevExpress Reporting v23.1已于前段时间…

Db2的Activity event monitor在Db2 MPP V2上收集ROWS_INSERTED信息

注&#xff1a;本文不是讲解Db2 Activity event monitor&#xff0c;只是一个用法实践。要了解Activity event monitor&#xff0c;请参考 https://www.ibm.com/docs/en/db2/11.5?topicevents-activity-event-monitoring 。 环境 Red Hat Enterprise Linux release 8.8 (Oot…

Linux下设置redis临时密码和长期密码

临时密码 第一步&#xff1a;先启动redis&#xff0c;命令&#xff1a;./src/redis-server ./redis.conf 第二步&#xff1a;进入redis&#xff0c;命令&#xff1a;./src/redis-cli 第三步&#xff1a;查看密码&#xff0c;命令&#xff1a;config get requirepass 如果你re…

leetcode 876.链表的中间结点

补充上次的环形链表没细讲的快慢指针&#xff08;这三道题现在可以连起来看&#xff09;&#xff0c;希望对你做题思路有帮助 876.链表的中间结点 题目 给你单链表的头结点 head &#xff0c;请你找出并返回链表的中间结点。 如果有两个中间结点&#xff0c;则返回第二个中间结…

Python实现FA萤火虫优化算法优化卷积神经网络分类模型(CNN分类算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 萤火虫算法&#xff08;Fire-fly algorithm&#xff0c;FA&#xff09;由剑桥大学Yang于2009年提出 , …

光伏设计方案中最重要的是什么?

随着人们对可再生能源的关注度不断提高&#xff0c;光伏发电成为了越来越受欢迎的选择。然而&#xff0c;在设计和实施光伏项目时&#xff0c;有很多因素需要考虑。那么&#xff0c;在光伏设计方案中&#xff0c;最重要的是什么呢&#xff1f; 地理位置和环境&#xff1a;选择合…

Unity 关于SetParent方法的使用情况

在设置子物体的父物体时&#xff0c;我们使用SetParent再常见不过了。 但是通常我们只是使用其中一个语法&#xff1a; public void SetParent(Transform parent);使用改方法子对象会保持原来位置&#xff0c;跟使用以下方法效果一样&#xff1a; public Transform tran; ga…

Your anti-virus program might be impacting your build performance

Your anti-virus program might be impacting your build performance.解决方案 在使用 AndroidStudio 时&#xff0c;经常会弹出框提示&#xff1a;Your anti-virus program might be impacting your build performance. Android Studio checked the following directories: …

【开源】基于Vue+SpringBoot的婚恋交友网站

项目编号&#xff1a; S 057 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S057&#xff0c;文末获取源码。} 项目编号&#xff1a;S057&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 会员管理模块2.3 新…

电子初学者,必须掌握的几种焊机方法

买过电烙铁的都知道商家会送一小卷焊锡&#xff0c;个人推荐这个送的焊锡就不要使用了&#xff0c;直接丢垃圾桶就好。因为这大部分都是回收的&#xff0c;熔点高&#xff0c;容易让焊盘脱落。 焊接电路板时&#xff0c;讲究从左到右&#xff0c;从上往下的顺序焊接&#xff0c…

QT之QString

QT之QString 添加容器 点击栅格布局 添加容器&#xff0c;进行栅格布局 布局总结&#xff1a;每一个模块放在一个Group中&#xff0c;排放完之后&#xff0c;进行栅格布局。多个Group进行并排时&#xff0c;先将各个模块进行栅格布局&#xff0c;然后都选中进行垂直布…