创建好的基于顺序存储结构的线性表存在两个方面的问题:
1)功能上的问题:数组操作符的重载带来的问题,有可能线性表被无用为数组了,线性表被当做数组来使用了。
2)效率方面的问题
本篇博客就要解决功能上的问题。
数组类的开发
需要在DTLib中提供安全可靠的原生数组的代替品,原生数组C++是直接支持的,但是原生数组有其自己的劣势,不能提供数组的长度信息,并且无法检测当前的操作是否合法。
——完成Array类的具体实现
——完成StaticArray类的具体实现
需求分析:
——创建数组类代替原生数组的使用
数组类包含长度信息
数组类能够主动发现越界访问
Array设计要点
——抽象类模板,存储空间的位置和大小由子类完成
——重载数组操作符,判断访问下标是否合法
——提供数组长度的抽象访问函数
——提供数组对象间的复制操作
Array.h
#ifndef ARRAY_H
#define ARRAY_H
#include "Object.h"
#include "Exception.h"
namespace DTLib
{
template
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 boot 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(IndexOutOfBoundsException,"Paramete i is invalid...");
}
}
T operator[] (int i) const
{
return (const_cast< Array >(*this)[i]);
}
virtual int length() const = 0;
};
}
#endif // ARRAY
StaticArray设计要点:
——类模板
封装原生数组
使用模板参数决定数组大小
实现函数返回数组长度
拷贝构造和赋值操作
#ifndef STATICARRAY_H #define STATICARRAY_H #include "Array.h" namespace DTLib { templateint N> class StaticArray : public Array{ protected: T m_space[N]; public: StaticArray() { this->m_array = m_space; } //拷贝构造和赋值操作 StaticArray(const StaticArray & obj ) { this->m_array = m_space; for(int i=0; i ) { m_space[i] = obj.m_space[i]; } } StaticArray & operator= (const StaticArray & obj) { if(this != &obj) { for(int i=0; i ) { m_space[i] = obj.m_space[i]; } } return *this; } int length() const { return N; } }; } #endif // STATICARRAY_H
测试
#include#include "StaticArray.h" using namespace std; using namespace DTLib; int main() { StaticArray<int ,5> sl; for(int i=0; i = i * i; } for(int i=0; i) { sl[i] ) { cout << sl[i] << endl; } return 0; }