StaticList和DynamicList(七)-创新互联

我们在上节博客中说到,在 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(七)

结果正是我们想要的,这个 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; im_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

我们来看看编译结果

StaticList 和 DynamicList(七)

结果已经正确输出了。那么回到我们之前的问题:是否能将 DynamicList 作为 StaticList 的子类实现呢?答案肯定是不行的,因为 DynamicList 和 StaticList 两个类在存储结构上完全是不同的。因此他们是等价的,所以不能将 DynamicList 作为 StaticList 的子类实现。通过今天对 DynamicList 和 StaticList 的学习,总结如下:1、StaticList 通过模板参数定义顺序存储空间;2、DynamicList 通过动态内存申请定义顺序存储空间;3、DynamicList 支持动态重置顺序存储空间的大小;4、DynamicList 中的 resize() 函数实现需要保证异常安全。

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


文章题目:StaticList和DynamicList(七)-创新互联
分享网址:http://hbruida.cn/article/diegoi.html