第17课 StaticList和DynamicList实现

Posted wanmeishenghuo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第17课 StaticList和DynamicList实现相关的知识,希望对你有一定的参考价值。

本节我们要实现StaticList和DynamicList,如下:

技术分享图片

 

StaticList的设计要点:

StaticList是一个类模板,使用原生数组作为顺序存储空间,使用模板参数决定数组大小

技术分享图片

 

  在StaticList的类模板中我们定义了一个元素数组作为顺序存储空间。这就是static的含义。因此,需要在构造函数当中将这个顺序存储空间挂接到父类的m_array上。

StaticList.h如下:

 1 #ifndef STATICLIST_H
 2 #define STATICLIST_H
 3 
 4 #include "SeqList.h"
 5 
 6 namespace DTLib
 7 {
 8 
 9 template < typename T, int N >
10 class StaticList : public SeqList<T>
11 {
12 protected:
13     T m_space[N];    //顺序存储空间,N为模板参数
14 public:
15     StaticList()    //指定父类成员的具体值
16     {
17         this->m_array = m_space;
18         this->m_length = 0;
19     }
20 
21     int capacity() const
22     {
23         return N;
24     }
25 };
26 
27 }
28 
29 #endif // STATICLIST_H

main函数测试程序如下:

 1 #include <iostream>
 2 #include "List.h"
 3 #include "SeqList.h"
 4 #include "StaticList.h"
 5 
 6 using namespace std;
 7 using namespace DTLib;
 8 
 9 
10 int main()
11 {
12     StaticList<int, 5> l;
13 
14     for(int i = 0; i < l.capacity(); i++)
15     {
16         l.insert(0, i);
17     }
18 
19     for(int i = 0; i < l.capacity(); i++)
20     {
21         cout << l[i] << endl;
22     }
23 
24     return 0;
25 }

执行结果如下:

技术分享图片

更改测试程序如下:

 1 #include <iostream>
 2 #include "List.h"
 3 #include "SeqList.h"
 4 #include "StaticList.h"
 5 #include "Exception.h"
 6 
 7 using namespace std;
 8 using namespace DTLib;
 9 
10 
11 int main()
12 {
13     StaticList<int, 5> l;
14 
15     for(int i = 0; i < l.capacity(); i++)
16     {
17         l.insert(0, i);
18     }
19 
20     for(int i = 0; i < l.capacity(); i++)
21     {
22         cout << l[i] << endl;
23     }
24 
25     try
26     {
27         l[5] = 5;
28     }
29     catch(IndexOutOfBoundsException& e)
30     {
31         cout << e.message() << endl;
32         cout << e.location() << endl;
33     }
34 
35     return 0;
36 }

第27行我们执行越界赋值操作,执行结果如下:

技术分享图片

 

 DynamicList的设计:

使用类模板

  申请连续堆空间作为顺序存储空间(StaticList使用的存储空间是“栈空间”(当我们定义的StaticList类对象也在栈上时))

  动态设置顺序存储空间的大小(StaticList中的存储空间大小是固定的,不能动态设置)

  保证重置顺序存储空间时的异常安全性

DynamicList中的存储空间是动态申请的,而且可以动态设置大小,实现上会比StaticList复杂。

DynamicList的设计要点:

函数异常安全的概念

  不泄露任何资源

  不允许破坏数据

函数异常安全的基本保证

  如果异常被抛出

    对象内的任何成员仍然能保持有效状态

    没有数据的破坏及资源泄漏

 


以上是关于第17课 StaticList和DynamicList实现的主要内容,如果未能解决你的问题,请参考以下文章

第17课 - 对象的构造

第17课 ++和--操作符分析

数据-第17课-栈课后练习

第17课 ++和--操作符分析

第三季-第17课-信号量同步编程

第17课 对象的构造(上)