C++数据结构--数组类实现

实现的目标

 

1、需求分析

A:创建数组类代替原生数组的使用

1.数组类包含长度信息

2.数组类能够主动发现越界访问

2、Array(数组类)设计要点

1抽象类模板,存储空间的位置和大小由子类完成

2.重载数组操作符,判断访问下标是否合法

3.提供数组长度的抽象访问函数

4.提供数组对象间的复制操作

由以上的分析可以得出Array类的声明

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

template <typename T>
class Array:public Object//继承自Object顶层父类
{
	protected:
		T* m_array;
	public:// 虚函数的实现
		virtual bool set(int i,const T&e);
		virtual bool get(int i,T& e)const;
		virtual int length()const=0;
		//数组访问操作符
		T& operator[](int i);
		T operator[](int i)const;
};

3、StaticArray设计要点

A:类模板

1.封装原生数组

2.使用模板参数决定数组大小

3.实现函数返回数组长度

4.拷贝构造和复制操作

//StaticArray类的声明
template<typename T,int N>
class StaticArray:public Array<T>
{
	protected:
		T* m_space[N];
	public:
		StaticArray();
		//拷贝和赋值操作
		StaticArray(const StaticArray<T,N>& obj);
		StaticArray<T,N>& operator=(const StaticArray<T,N>& obj);
		
		int length()const;
};

4、DynamicArray设计要点

A.类模板

1.动态确定内部数组空间的大小

2.实现函数返回数组长度

3.拷贝构造和赋值操作

//DynamicArray类的声明
template<typename T>
class DynamicArray:public Array<T>
{
	protected:
		int m_length;
	public:
		DynamicArray(int length);
		DynamicArray(const DynamicArray<T>& obj);
		DynamicArray<T>& operator=(const DynamicArray<T>& obj);
		
		int length()const;
		void resize(int length);//动态重置数组的长度
		
		~DynamicArray();
};

5、完整的代码实现

Array
#ifndef ARRAY_H
#define ARRAY_H

#include "Object.h"
#include "Exception.h"
//原生数组类
namespace MyLib
{
    template <typename T>
    class Array: public Object
    {
    protected://protect继承 使得子类可以调用
        T* m_array;
    public:
        virtual bool set(int i,const T&e)
        {
            bool ret=((0<=i)&&(i<length()));//判断条件

            if(ret)
            {
                m_array[i]=e;
            }
            return ret;
        }

        virtual bool get(int i,T&e)const
        {
            bool ret=((0<=i)&&(i<length()));

            if(ret)
            {
                e=m_array[i];
            }

            return ret;
        }
        virtual int length()const=0;//纯虚函数 子类实现
        //数组访问操作符
        T& operator[](int i)//数组重载操作符的实现
        {
            if((0<=i)&&(i<length()))
            {
                return m_array[i];
            }
            else
            {
                THROW_EXCEPTION(indexOutOfBoundsException,"Parameter i is invalid");//访问越界
            }
        }
        T operator[](int i)const
        {
            return(const_cast<Array<T>&>(*this))[i];//强制类型转换去除const属性
        }
    };
}

#endif // ARRAY_H


StaticArray
#ifndef STATICARRAY_H
#define STATICARRAY_H

#include "Array.h"
//设计要点
//1.封装原生数组
//2.使用模板参数决定数组大小
//3.实现函数返回数组长度
//4.拷贝构造和赋值操作
namespace MyLib
{
    template <typename T,int N>
    class StaticArray :public Array<T>
    {
    protected:
        T m_space[N];//原生数组
    public:
        StaticArray()
        {
            this->m_array=m_space;//父类的m_array指向子类的原生数组
        }

        StaticArray(const StaticArray<T,N>& obj)
        {
            this->m_array=m_space;
            for(int i=0;i<N;i++)//用于具体赋值数组元素的值
            {
                m_space[i]=obj.m_space[i];
            }
        }

        StaticArray<T,N>& operator=(const StaticArray<T,N>& obj)
        {
            if(this!=&obj)//自赋值情况的避免
            {
                for(int i=0;i<N;i++)
                {
                    m_space[i]=obj.m_space[i];
                }
            }

            return *this;
        }

        int length() const
        {
            return N;
        }
    };
}

#endif // STATICARRAY_H


DynamicArray
#ifndef DYNAMICARRAY_H
#define DYNAMICARRAY_H

#include "Array.h"
#include "Exception.h"

namespace MyLib
{
    template <typename T>
    class DynamicArray:public Array<T>
    {
    protected:
        int m_length;
        T* copy(T* array,int len,int newlen)
        {
            T* ret=new T[newlen];

            if(ret!=NULL)
            {
                int size=(len<newlen)?len:newlen;

                for(int i=0;i<size;i++)
                {
                    ret[i]=array[i];
                }
            }

            return ret;
        }

        void update(T* array,int length)
        {
            if(array!=NULL)
            {
                T* temp=this->m_array;

                this->m_array=array;
                this->m_length=length;

                delete [] temp;
            }
            else
            {
                THROW_EXCEPTION(NoEoughMemoryException,"...");
            }
        }
    public:
        DynamicArray(int length)
        {
            this->m_array=new T[length];//堆空间申请内存

            if(this->m_array!=NULL)
            {
                this->m_length=length;
            }
            else
            {
                THROW_EXCEPTION(NoEoughMemoryException,"No memory to ....");
            }
        }

        DynamicArray(const DynamicArray<T>& obj)
        {
            this->m_array=new T[obj.m_length];//堆空间申请内存

            if(this->m_array!=NULL)
            {
                this->m_length=obj.m_length;

                for(int i=0;i<obj.m_length;i++)//进行拷贝的工作
                {
                    this->m_array[i]=obj.m_array[i];
                }
            }
            else
            {
                THROW_EXCEPTION(NoEoughMemoryException,"No memory to ....");
            }
        }

        DynamicArray<T>& operator=(const DynamicArray<T>& obj)
        {         
            if(this!=&obj)
            {
                T* array=copy(obj.m_array,obj.m_length,obj.m_length);
                update(array,obj.m_length);
            }
        }

        int length() const
        {
            return m_length;
        }

        void resize(int length)
        {
            if(length!=m_length)
            {
                T* array=copy(this->m_array,m_length,length);
                update(array,length);
                /*
                    T* array=new T[length];

                    if(array!=NULL)
                    {
                        int size=(length<m_length)?length:m_length;

                        for(int i=0;i<size;i++)
                        {
                            array[i]=this->m_array[i];
                        }

                        T* temp=this->m_array;

                        this->m_array=array;
                        this->m_length=length;

                        delete [] temp;
                    }
                    else
                    {
                        THROW_EXCEPTION(NoEoughMemoryException,"No memory to...");
                    }
                    */
            }
        }

        ~DynamicArray()
        {
            delete[] this->m_array;
        }
    };
}

#endif // DYNAMICARRAY_H

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值