第19课 - 数组类的创建(上)

版权声明:课程笔记内容整理于狄泰软件 https://blog.csdn.net/qq_39654127/article/details/79965750

1、数组类的创建

课程目标 

                -完成Array类的具体实现 

                -完成StaticArray类的具体实现 

   

 

需求分析 

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

                           ★数组类包含长度信息 

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

  

Array设计要点 

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

                -重载数组操作符,判断访问下标是否台法 

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

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

 

         Array类的声明 

template <typename T>  
class Array : public 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* array() const;
  
    T& operator [] (int i);
    T operator [] (int i) const ;
};

 

2、编程实验 

数组抽象类实现     Array.h 

#ifndef ARRAY_H  
#define ARRAY_H  
  
#include "Object.h"  
#include "Exception.h"  
  
namespace DTLib  
{  
  
template <typename T>  
class Array : public Object  
{  
protected:  
    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;  
    }  
  
    T& operator [] (int i)  
    {  
        if((0 <= i) && (i < length()))  
        {  
            return m_array[i];  
        }  
        else  
        {  
            THROW_EXCEPTION(IndexOutOfBoundsExpception,"Parameter i is invalid ...");  
        }  
    }  
    T operator [] (int i) const  
    {  
        return (static_cast<Array<T>&>(*this)[i]);  
    }  

    T* array() const
    {
        return m_array;
    }
  
    virtual int length() const = 0 ;  
  
};  
  
}  
  
  
#endif // ARRAY_H  

 

StaticArray设计要点

                    ★封装原生数组 

                    ★使用模板参数决定数组大小 

                    ★实现函数返回数组长度 

                    ★拷贝构造赋值操作 

 

        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;
};

 

3、编程实验 

静态数组类的实现     StaticArray.h

StaticArray.h

#ifndef STATICARRAY_H  
#define STATICARRAY_H  
  
#include"Array.h"  
namespace DTLib  
{  
  
template <typename T,int N>  
class StaticArray : public Array<T>  
{  
protected:  
    T m_space[N];  
public:  
    StaticArray()  
    {  
        this->m_array = m_space;  
    }  
    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  

main.cpp

 

#include<iostream>  
#include"StaticArray.h"  
  
using namespace std;  
using namespace DTLib;  
  
int main()  
{  
    StaticArray<int,5> s1;  
  
    for(int i=0; i<s1.length(); i++)  
    {  
        s1[i] = i * i;  
    }  
    for(int i=0; i<s1.length(); i++)  
    {  
        cout << s1[i] << endl;  
    }  
  
    StaticArray<int ,5> s2;  
  
    s2 = s1;  
  
    for(int i=0; i<s2.length(); i++)  
    {  
        cout << s2[i] << endl;  
    }  
  
    int s3[2];  
  
    s3[4] = 100;    //难以调试  
  
    s2[6] = 100;      //越界访问
      
  
  
    return 0;  
}  

 

 

4、实战预告 

        To be continued ... 

        思考: 

                如何实现DynamicArray

            DynamicArrayStaticArray的差异在哪里? 

                

 

 

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页