-
课程目标
— 完成 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_H
2、数组类的创建
- 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_H
main.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;
}