数组类

数组类


开发理由:

原生的数组创建后没有大小的概念
原生数组对越界访问只有警告,不易发现
数组变量之间不能互相赋值


设计要点:

抽象类模板
存储空间的位置和大小由子类完成
提供数组长度的抽象函数
[]操作符重载,判断下标是否合法
同类型对象间的复制操作


代码表现:

template <typename T>

class Array : public Object
{
protected:
    T* m_array;

public:
    bool set(int i, const T& t);
    bool get(int i, T& t);

    T& operator [] (int i);
    T operator [] (int i) const;

    virtual int length() const = 0;

};

数组类的对象也不只一种,所以我们把两种相同的操作抽象出来实现成Array类。


代码实现:

template <typename T>

class Array : public Object
{
protected:
    T* m_array;

public:
    bool set(int i, const T& t)
    {
        bool ret = ((i >= 0) && (i < length()));

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

        return ret;
    }

    bool get(int i, T& t)
    {
        bool ret = ((i >= 0) && (i < length()));

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

        return ret;
    }

    T& operator [] (int i)
    {
        if((i >= 0) && (i < length()))
        {
            return m_array[i];
        }
        else
        {
            THROW_EXCEPTION(IndexOutOfBoundsException,"Parameter is invalid!");
        }
    }

    T operator [] (int i) const
    {
        return (const_cast<Array<T>&>(*this))[i];
    }

    virtual int length() const = 0;

};


小程序讲解:

所有方法的实现都对下标进行了检查,保证了数组不会越界。
[]重载的const实现,因为代码和非const版本是相同的,所以为了避免相同的代码多次出现,直接调用非const版本的方法,然后得到的结果去掉常量属性后返回。
这里的长度指的是数组定义时的容量,而不是数组当前已经使用了的空间,不同于线性表。所以可以通过[]实现读写元素的值。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值