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

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

1、数组类的创建

目标:完成ArrayStaticArray类的具体实现 

   

 

需求分析 

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

                           ★ 数组类包含长度信息 

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

Array设计要点 

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

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

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

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

 

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设计要点

                    ★ 封装原生数组 

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

                    ★ 实现函数返回数组长度 

                    ★ 拷贝构造赋值操作 

3、编程实验 

静态数组类的实现     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;//创建容量为5静态数组存放int数据

    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;//再创建一个容量为5的数组存放int数据

    s2 = s1;//调用重载的赋值操作符重载函数,将s1的值拷贝到s2

    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的差异在哪里? 

                

第20课 - 数组类的创建(下)

 

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

私密
私密原因:
请选择设置私密原因
  • 广告
  • 抄袭
  • 版权
  • 政治
  • 色情
  • 无意义
  • 其他
其他原因:
120
出错啦
系统繁忙,请稍后再试

关闭