课程目标 — 完成 Array 类的具体实现 — 完成 StaticArray 类的具体实现
需求分析 — 创建数组类代替原生数组的使用 数组类包含长度信息 数组类能够主动发现越界访问
Array 设计要点 — 抽象类模板,存储空间的位置和大小由子类完成 — 重载数组操作符,判断访问下标是否合法 — 提供数组长度的抽象访问函数 — 提供数组对象间的复制
Array 类的声明
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(IndexOutOfBoundsException, "Parameter i is Invalid"); } } T operator[](int i)const { return (const_cast<Array<T>&>(*this)[i]); } virtual int length()const = 0; }; } #endif // ARRAY_H2、数组类的创建
StaticArray 设计要点 — 类模板 StaticArray 类的声明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_Hmain.cpp
#include <iostream> #include "StaticArray.h" using namespace std; using namespace DTLib; int main() { StaticArray<int, 5> sa; for(int i = 0;i < sa.length(); i++) { sa[i] = i*i; } for(int i = 0;i < sa.length(); i++) { cout << sa[i] << endl; } StaticArray<int, 5> aa; aa = sa; for(int i = 0; i < aa.length(); i++) { cout << aa[i] << endl; } sa[6] = 5; return 0; }