---- 整理自狄泰软件唐佐林老师课程
1. 问题
基于顺序存储结构的线性表可能被当成数组误用,这一节设计数组类来替代原生数组。
2. 课程目标
3. 设计要点
- Array 是一个抽象类,这个类存在的意义就是用来被继承。
- 需求分析:
- 设计要点
-
- 抽象类模板,存储空间的位置和大小由子类完成
-
- 重载数组操作符,判断访问下标是否合法
-
- 提供数组长度的抽象访问函数
-
- 提供数组对象间的复制操作(原生数组不提供复制操作,我们数组要提供复制操作)
-
Array__21">4. 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& operator[](int i);T operator[](int i) const;
};
Array>StaticArray_41">5. Array>StaticArray
5.1 设计要点
- 类模板
- 封装原生数组
- 使用模板参数决定数组大小
- 实现函数返回数组长度
- 拷贝构造和赋值操作
Array>StaticArray__49">5.2 Array>StaticArray 类的声明
template <typename T, int N>
class Array>StaticArray : public Array<T>
{
protected:T m_space[N];
public:Array>StaticArray();Array>StaticArray(const Array>StaticArray<T, N>& obj);Array>StaticArray<T, N>& operator= (const Array>StaticArray<T, N>& obj);int length() const;
};
5.3 实现
Array_67">6. DynamicArray
6.1 设计要点
- 类模板
- 动态确定内部数组空间的大小
- 实现函数返回数组长度
- 拷贝构造和赋值操作
Array__74">6.2 DynamicArray 类的声明
template <typename T, int N>
class DynamicArray : public Array<T>
{
protected:int length;
public:DynamicArray(int length);DynamicArray(const DynamicArray<T>& obj);DynamicArray<T>& operator= (const DynamicArray<T>& obj);int length() const;void resize(int length);~DynamicArray();
};
6.3 实现
6.4 重构
- DynamicArray 类中的函数实现存在重复的逻辑,如何进行代码优化?
- 重复代码逻辑的抽象
- init - 对象初始化时的初始化操作
- copy - 在堆空间中申请新的内存,并执行拷贝操作
- update - 将指定的堆空间作为内部存储数组使用