c++ - C++:有人可以大致解释一下如何为抽象数据类型设计/编写析构函数吗?
问题描述
提前感谢您提供的任何帮助。我正在努力弄清楚究竟是什么进入了析构函数,因为我还没有找到一个很好的解释来说明你是如何用代码实现这个想法的。我的教科书和我读过的一些不同的东西解释说,析构函数本质上是一种为抽象数据类型 (ADT) 调用的方法,它有助于释放 ADT 对象使用的任何资源/内存。我的教科书代码示例虽然实际上只是在析构函数内部有一个 cout 语句,上面写着“对象即将被销毁”,但您可以想象它并不是特别有用。
我正在处理一个堆栈项目,我们正在创建一个指向名为 Data 的结构对象的指针堆栈(它没有析构函数,请阅读一点关于为什么更早的内容),它包含两个属性:int ID 和字符串数据. 那么堆栈本身只有两个属性:int top(保存 peek 和 pop 函数的顶部值)和 Data 指针数组。
那么我需要删除顶部并删除指针堆栈吗?我可以只删除整个指针堆栈,还是需要遍历堆栈并删除其中的所有内容,然后再删除堆栈数组本身?如果我确实需要删除每个指针,我可以只删除指针吗?或者我是否需要弄清楚如何删除指针指向的内存位置内的信息?我是否使用 delete 关键字来做所有这些事情?
在删除析构函数中的东西时,我只是想弄清楚我需要专门针对什么。一旦我知道了这么多,我认为我可以通过谷歌搜索语法并在 IDE/终端中进行测试来弄清楚如何进行实际写作,如果语法不太有效,请与教授仔细检查,等等。
通常我会在课堂上向我的教授提出这些问题,但是这门课本身是针对数据结构和算法的,所以我不想打断这些话题去问一些感觉有点倒退的问题。我想也许这些东西应该包含在先修课程中,但是我前一阵子上过那门课,根据我仍然拥有的那本教科书,这些东西似乎并没有被很好地涵盖(而且没有讲课,因为它在线)。
我真的很想深入学习这些概念,并尽可能多地了解它们背后的架构,以便为编写好的代码和在专业环境中工作做好充分的准备。再次感谢大家提供的任何帮助!
解决方案
以下是为抽象类编写析构函数的三种方法:
可以多态地删除该类:
class BaseClass { public: virtual ~BaseClass() = default; };
该类可以多态使用,但删除总是使用确切的运行时类型(例如
std::make_shared()
以这种方式操作)class BaseClass { protected: /* not virtual */ ~BaseClass() = default; };
该类只是一个花哨的命名空间(命名空间缺少一些功能)并用作容器但从未实例化:
template<stuff> class FancyNameSpace { private: /* virtual doesn't matter */ ~FancyNamespace() = delete; };
类层次结构应始终使用编译器生成的默认析构函数,只更改访问和虚拟性。这是因为作为基类的职责与管理资源是分开的,所以单一职责原则说资源管理应该转移到一个辅助类,它的唯一功能是基于范围的资源管理(RAII)。
推荐阅读
- python - 计算行列表中的值除以嵌套字典中的键
- c++ - 将 C++ 代码转换为 webassembly 的脚本未终止
- matlab - MATLAB parfor 循环和随机模拟
- c# - 如何使用 C# 在 PowerPoint 中设置圆角矩形半径?
- wso2 - wso2 sp - 两个文件源
- asp.net-web-api - 拖入文件时,HTML拖放区文件上传不起作用
- c++ - 值到类型的运行时映射
- java - “无效方法不能返回值” - 在 java 中处理 3
- python - 用单引号将双引号替换为python列表
- css - 当我将 mapbax-gl.css 与 react/typescript 一起使用时出现错误