标签:大小 存储 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的设计要点:
函数异常安全的概念
不泄露任何资源
不允许破坏数据
函数异常安全的基本保证
如果异常被抛出
对象内的任何成员仍然能保持有效状态
没有数据的破坏及资源泄漏
标签:大小 存储 alt names ios template 操作 i++ protect
原文地址:https://www.cnblogs.com/wanmeishenghuo/p/9501825.html