我们在上节博客中说到,在 SeqList 下又可以衍生出 StaticList 和 DynamicList两个子类。那么我们今天就来看看这两个子类,它们是如何实现的以及它们之间有何区别。
创新互联业务包括:成品网站、企业产品展示型网站建设、高端网站设计、电子商务型网站建设、成都外贸网站建设公司(多语言)、商城建设、按需策划、成都全网营销推广等。效率优先,品质保证,用心服务是我们的核心价值观,我们将继续以良好的信誉为基础,秉承稳固与发展、求实与创新的精神,为客户提供更全面、更优质的互联网服务!
A、StaticList的设计要点:首先必须是一个类模板。其次是使用原生数组作为顺序存储空间,最后是使用模板参数决定数组大小。定义如下
template < typename T, int N > class StaticList : public SeqList{ protected: T m_space[N]; // 顺序存储空间,N 为模板参数 public: StaticList(); // 指定父类成员的具体值 int capacity() const; };
我们下来来实现 StaticList ,代码如下
StaticList.h 源码
#ifndef STATICLIST_H #define STATICLIST_H #include "Seqlist.h" namespace DTLib { template < typename T, int N > class StaticList : public SeqList{ protected: T m_space[N]; // 顺序存储空间,N 为模板参数 public: StaticList() // 指定父类成员的具体值 { this->m_array = m_space; this->m_length = 0; } int capacity() const { return N; } }; } #endif // STATICLIST_H
我们来写个测试代码测试下这个 StaticList ,main.cpp 代码如下
#include#include "StaticList.h" using namespace std; using namespace DTLib; int main() { StaticList l; for(int i=0; i 我们来看看输出结果
结果正是我们想要的,这个 StaticList 类已经实现完毕。接下来我们再来实现 DynamicList 类。
B、DynamicList类的设计要点:它也必须得是一个类模板。申请连续堆空间作为顺序存储空间;动态设置顺序存储空间的大小;保证重置顺序存储空间时的异常安全性。
a> 函数异常安全的概念:1、不泄露任何资源;2、不允许破坏数据。
b> 函数异常安全的基本保证,如果对象被抛出:对象内的任何成员仍然能保持有效状态;没有数据的破坏及资源泄漏。
下来我们来看看它的定义
template < typename T > class DynamicList : public SeqList{ protected: int m_capacity; // 顺序存储空间的大小 public: DynamicList(int capacity); // 申请空间 int capacity() const; // 重新设置顺序存储空间的大小 void resize(int capacity); ~DynamicList(); // 归还空间 }; 下来我们来实现这个 DynamicList 类
DynamicList.h 源码
#ifndef DYNAMICLIST_H #define DYNAMICLIST_H #include "SeqList.h" #include "Exception.h" namespace DTLib { template < typename T > class DynamicList : public SeqList{ protected: int m_capacity; // 顺序存储空间的大小 public: DynamicList(int capacity) // 申请空间 { this->m_array = new T[capacity]; if( this->m_array != NULL ) { this->m_length = 0; this->m_capacity = capacity; } else { THROW_EXCEPTION(NoEnoughMemoryException, "No memory to create DynamicList ..."); } } int capacity() const { return m_capacity; } void resize(int capacity) { if( this->m_capacity != capacity ) { T* array = new T[capacity]; if( array != NULL ) { int length = (this->m_length < m_capacity) ? this->m_length : capacity; for(int i=0; i m_array[i]; } T* temp = this->m_array; this->m_array = array; this->m_length = length; this->m_capacity = capacity; delete[] temp; } else { THROW_EXCEPTION(NoEnoughMemoryException, "No memory to resize DynamicList Object ..."); } } } ~DynamicList() { delete[] this->m_array; } }; } #endif // DYNAMICLIST_H 我们同样还是写个示例代码来验证下这个 DynamicList 类,main.cpp 代码如下
#include#include "DynamicList.h" using namespace std; using namespace DTLib; int main() { DynamicList l(5); for(int i=0; i 我们来看看编译结果
结果已经正确输出了。那么回到我们之前的问题:是否能将 DynamicList 作为 StaticList 的子类实现呢?答案肯定是不行的,因为 DynamicList 和 StaticList 两个类在存储结构上完全是不同的。因此他们是等价的,所以不能将 DynamicList 作为 StaticList 的子类实现。通过今天对 DynamicList 和StaticList 的学习,总结如下:1、StaticList 通过模板参数定义顺序存储空间;2、DynamicList 通过动态内存申请定义顺序存储空间;3、DynamicList 支持动态重置顺序存储空间的大小;4、DynamicList 中的 resize() 函数实现需要保证异常安全。
标题名称:StaticList和DynamicList(七)
网址分享:http://jkwzsj.com/article/jjdgep.html