数组类
开发理由:
原生的数组创建后没有大小的概念
原生数组对越界访问只有警告,不易发现
数组变量之间不能互相赋值
设计要点:
抽象类模板
存储空间的位置和大小由子类完成
提供数组长度的抽象函数
[]操作符重载,判断下标是否合法
同类型对象间的复制操作
代码表现:
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版本的方法,然后得到的结果去掉常量属性后返回。
这里的长度指的是数组定义时的容量,而不是数组当前已经使用了的空间,不同于线性表。所以可以通过[]实现读写元素的值。