//功能:动态数组类模板 //作者:CXW06023273 /// #include<string> using namespace std; template <class DataType> class Array { public: Array(int iSize); Array(const Array<DataType> & ap); inline DataType & operator [](int iIndex); void ChangeSize(int iNewSize); inline int length() const; inline void deepCopy(const Array<DataType> & original); Array<DataType> & operator =(const Array<DataType> &right); string err() const; ~Array(); private: DataType *elements; int capacity; DataType dud; //发生越界错误时,从重载的[]运算符返回 int errorCode; //指定错误码 }; // // Error code // 0 No Error // 1 不正确的数组大小参数传入构造函数中 // 2 数组越界 // 4 不正确的数组大小传入ChangeSize函数中 // #include "Array.h" template <class DataType> Array<DataType>::Array(int iSize) { if(iSize<1) { capacity=1; errorCode=1; //不合适的参数 } else { capacity=iSize; errorCode=0; //没有错误 } elements=new DataType[capacity]; } template <class DataType> inline DataType& Array<DataType>::operator[] (int iIndex) { #ifdef DEBUG_ARRAY if(iIndex<0 || iIndex>=capacity) { errorCode |=2; //越界 return dud; } #endif return elements[iIndex]; } template <class DataType> void Array<DataType>::ChangeSize(int iNewSize) { if(iNewSize<1) { errorCode |=4; //不正确的初始化参数 return; } DataType *newArray=new DataType[iNewSize]; int limit=(iNewSize>capacity ? capacity : iNewSize); for(int i=0;i<limit;i++) { newArray[i]=elements[i]; } elements=newArray; capacity=iNewSize; } template <class DataType> inline int Array<DataType>::length() const { return capacity; } template <class DataType> string Array<DataType>::err() const { if(errorCode==0) return "No error./n"; string errorMessage=""; if(errorCode & 1) { errorMessage+="不正确的数组大小传入构造函数中,/n"; errorMessage+="capacity 被设置成默认的大小1./n"; } if(errorCode & 2) errorMessage+="访问越界./n"; if(errorCode & 4) { errorMessage +="不正确的数组大小传入ChangeSize函数,/n"; errorMessage +="数组大小不改变./n"; } return errorMessage; } template <class DataType> Array<DataType>::~Array() { delete []elements; } template <class DataType> Array<DataType>::Array(const Array<DataType> & ap) { deepCopy(ap); } template <class DataType> void Array<DataType>::deepCopy(const Array<DataType> & original) { capacity=original.capacity; errorCode=original.errorCode; elements=new DataType[capacity]; for (int i=0;i<capacity;i++) { elements[i]=original.elements[i]; } } template <class DataType> Array<DataType> & Array<DataType>::operator =(const Array<DataType> &right) { if (this==&right) { return *this; } delete []elements; deepCopy(right); return *this; } #include<iostream> #define DEBUG_ARRAY #include "Array.cpp" using namespace std; void getElements(Array<int> & numbers); float calcAverage(Array<int> avnums); int main() { Array<int> nums(2); getElements(nums); float average=calcAverage(nums); cout<<"The average is:"<<average<<endl; cout<<nums.length()<<endl; return 0; } void getElements(Array<int> & numbers) { int i=0; cout<<"Please input positive integer: "; cin>>numbers[i]; while(numbers[i]!=-1) { i++; if(i==numbers.length()) numbers.ChangeSize(i<<1); cout<<"Enter a positive integer(Enter -1 to stop): "; cin>>numbers[i]; } numbers.ChangeSize(i); cout<<"getElements: "<<numbers.err(); } float calcAverage(Array<int> avnums) { int sum=0; for(int i=0;i<avnums.length();i++) { sum+=avnums[i]; } cout<<"calcAverage: "<<avnums.err(); return sum/float(avnums.length()); }