文章目录

  • 1 继承关系图和接口实现
  • 2 代码实现
  • 3 顺序存储线性表的分析

1 继承关系图和接口实现

DynamicList设计要点:
当前类当然是类模板

  • 申请连续堆空间作为顺序存储空间
  • 动态设置顺序存储空间的大小
  • 保证重置顺序存储空间时的异常安全性

函数异常安全的概念:

  • 不泄露任何资源
  • 不允许破坏数据

函数异常安全的基本保证:
如果异常被抛出,对象内的任何成员仍然保持有效状态,并且没有数据的破坏及资源泄露。

DynamicList接口实现:

template < typename T >
class DynamicList : public SeqList<T>
{protected:int m_capacity;   // 顺序存储空间的大小public:DynamicList(int capacity);   // 申请空间int capacity() const;void resize(int capacity);  // 重新设置存储空间的大小~DynamicList(); // 归还空间
};

DynamicList继承类图:


2 代码实现

DynamicList.h

#ifndef DYNAMICLIST_H
#define DYNAMICLIST_H#include "Seqlist.h"
#include "Exception.h"namespace LemonLib {template < typename T >
class DynamicList : public SeqList<T>
{protected:int m_capacity;public:DynamicList(int capacity){this->m_array = new T[capacity];if (this->m_array != NULL){this->m_length = 0;m_capacity = capacity;}else{THROW_EXCEPTION(NoEnoughMemoryException, "No enough memory to new DynamicList object...");}}int capacity() const{return m_capacity;}void resize(int capacity){if (capacity != m_capacity){T* array = new T[capacity];if (array != NULL){int len = (this->m_length < capacity) ? this->m_length : capacity;for (int i=0; i<len; i++){array[i] = this->m_array[i];    /* 赋值发生异常时,捕获异常后,当前对象仍然是可用的,保证了异常安全 */}T* temp = this->m_array;this->m_array = array;this->m_length = len;this->m_capacity = capacity;delete[] temp;  /* 之所以最后才delete是为了防止delete时调用析构函数,*//* 而析构函数中抛出异常导致当前对象构造不完全 *//* 保证异常安全 */}}}~DynamicList(){delete[] this->m_array;}
};}#endif // DYNAMICLIST_H

测试代码main.cpp

#include <iostream>
#include "Object.h"
#include "Exception.h"
#include "List.h"
#include "Seqlist.h"
#include "Staticlist.h"
#include "Dynamiclist.h"using namespace std;
using namespace LemonLib;int main()
{DynamicList<int> sl(5);for (int i=0; i<sl.capacity(); i++){sl.insert(0, i);}for (int i=0; i<sl.length(); i++){cout << sl[i] << endl;}sl.remove(3);for (int i=0; i<sl.length(); i++){cout << sl[i] << endl;}try{sl[5] = 0;}catch (const Exception& e){cout << e.message() << endl;cout << e.location() << endl;}return 0;
}

3 顺序存储线性表的分析

下面的代码是否正确?

void func()
{DynamicList<int> d1(5);DynamicList<int> d2 = d1; // copy assignmentfor (int i=0; i<d1.capacity(); i++){d1.insert(i, i);d2.insert(i, i*i);}for (int i=0; i<d1.length(); i++){cout << d1[i] << endl;}
}

分析: 上面的代码是有很大的问题的。DynamicList<int> d2 = d1这句话是实际上是进行了拷贝构造,显然这里是浅拷贝。那么,d1和d2的m_array将会指向同一片堆空间,那么d2进行的操作将会覆盖d1进行的操作。

解决办法: 对于容器类型的类,可以考虑禁用拷贝构造和赋值操作(直接在List类中进行相关处理即可)。

DynamicList相关推荐

  1. 3d饼图 vue_Vue+Echarts构建可视化大数据平台实战项目分享(附源码)(上)

    前言 分享之前我们先来普及一下什么是数据可视化?数据可视化可以把数据从冰冷的数字转换成图形,揭示蕴含在数据中的规律和道理.数据可视化通俗来说就是:数据的展示.处理和分析.目的是借助于图形化手段,清晰有 ...

  2. DualCircleList

    文章目录 1 Linux内核链表介绍 1.1 移植Linux内核链表 1.1.1 Linux内核链表的位置及依赖 1.1.2 移植时的注意事项 1.2 Linux内核链表剖析 1.2.1 Linux内 ...

  3. DualLinkList

    文章目录 1 单链表的缺陷 2 双向链表的实现 2.1 设计思路 2.2 双向链表的继承层次结构 2.3 DualLinkList的定义 2.4 双向链表的特点 3 代码实现 4 开放性问题 1 单链 ...

  4. CircleList

    文章目录 1 循环链表的实现 1.1 什么是循环链表 1.2 循环链表的逻辑构成 1.3 循环链表的继承层次结构 1.4 循环链表的实现思路 1.5 循环链表的实现要点 2 代码实现 3 循环链表的应 ...

  5. SharedPointer

    文章目录 1 继承关系类图 2 SharedPointer设计要点 3 代码实现 4 智能指针相关注意点 1 继承关系类图 2 SharedPointer设计要点 SharedPointer肯定是类模 ...

  6. SmartPointer

    文章目录 1 继承关系类图 2 代码实现 1 继承关系类图 2 代码实现 SmartPointer.h #ifndef SMARTPOINTER_H #define SMARTPOINTER_H#in ...

  7. StaticLinkList

    文章目录 1 静态单链表的出现原因 2 静态单链表的实现思路 3 继承关系图 4 代码实现 5 StaticLinkList需要增加析构函数吗 1 静态单链表的出现原因 如果需要频繁的删除元素,并且数 ...

  8. DynamicArray

    文章目录 1 DynamicArray设计要点 2 继承关系图和接口实现 3 代码实现 4 代码优化 1 DynamicArray设计要点 类模板 动态确定内部数组空间的大小 实现函数返回数组长度 构 ...

  9. StaicArray

    文章目录 1 StaticArray设计要点 2 继承关系图和接口实现 3 代码实现 1 StaticArray设计要点 类模板 封装原生数组 使用模板参数决定数组大小 实现函数返回数组长度 拷贝构造 ...

最新文章

  1. 第四层到第七层的高层交换技术及其应用
  2. Python程序设计题解【蓝桥杯官网题库】 DAY6-基础练习
  3. C指针原理(19)-C指针基础
  4. 牛客题霸 [ 树的直径] C++题解/答案
  5. 【OS学习笔记】一 处理器、内存和指令
  6. [memory]虚拟地址空间分布
  7. 普通人如何站在时代风口学好AI?这是我看过最好的答案
  8. php中案值传递和安引用传递,PHP里的值传递与引用传递
  9. Ubuntu 10.04中配置ip地址
  10. 用html和CSS做个人简历
  11. 萤火小程序商城系统安装教程
  12. 软件构造笔记——Java基本数据类型和对象数据类型
  13. 轻松打造自己的站内搜索引擎
  14. Git Re-Basin: Merging Models modulo Permutation Symmetries解读
  15. Windows下x64反汇编参数传递约定,一句话,调用顺序为从左到右, Function( rcx, rdx, r8,r9, [rsp+0x20], [rsp+0x28], [rsp+0x30]..
  16. require() 的基本用法
  17. 阿里云RPA(机器人流程自动化)干货系列之五:业务流程梳理方法...
  18. 域名抢注哪个通道成功率高?价格贵不贵?
  19. java分页类Page
  20. 《编程珠玑》读书笔记 part1

热门文章

  1. java try resource_从 Java 字节码角度看 try with resource 语法糖
  2. 5.5 SVM补充-机器学习笔记-斯坦福吴恩达教授
  3. android4.0 编译报错 Xmx2048m错误 .
  4. 【PC工具】一个好用的评分很高的文件管理器Files
  5. 【PC工具】更新chrome谷歌浏览器最新离线安装版各种版本,最好用的浏览器没有之一...
  6. 嵌入式系统 Boot Loader 技术内幕-目前看到介绍Boot loader最通俗明了的文章
  7. 8、SpringBoot-CRUD默认访问的首页以及thyleaf的静态文件引入/WebMvcConfigurer / WebMvcConfigurationSupport...
  8. Oracle 12c 安装(内附软件包)
  9. 原创 深度 技术:WatchStor焦点周刊创刊号
  10. PLC与IC卡读卡器