码迷,mamicode.com
首页 > 其他好文 > 详细

第17课 StaticList和DynamicList实现

时间:2018-08-19 17:32:17      阅读:122      评论:0      收藏:0      [点我收藏+]

标签:大小   存储   alt   names   ios   template   操作   i++   protect   

本节我们要实现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实现

标签:大小   存储   alt   names   ios   template   操作   i++   protect   

原文地址:https://www.cnblogs.com/wanmeishenghuo/p/9501825.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!