#include <iostream> #include <cstdarg> using std::out_of_range; using std::ostream;
template<typename T> class Array { protected: unsigned int size; T* data; public: //构造函数 Array(unsigned int _size=0); Array(unsigned int count, T data1, ...);
#include "Array.h" #include <iostream> #include <cstdarg> using std::ostream; using std::out_of_range;
template <typename T> class Array2D { protected: unsigned int rows; unsigned int cols; Array<T> array; public: //构造函数 Array2D(unsigned int _rows=0, unsigned int _cols=0); Array2D(unsigned int _rows, unsigned int _cols, T data1, ...); //两种重载运算符 class RowArray; RowArray operator[](unsigned int row); const RowArray operator[](unsigned int row) const; friend ostream& operator<<(ostream& os, const Array2D<T>& array2D);
//计算第二维下标操作的嵌套类 class RowArray { private: const Array2D<T>& array2D; unsigned int row; public: RowArray(Array2D<T>& _array2D, unsigned int _row=0): array2D(_array2D), row(_row) {} RowArray(const Array2D<T>& _array2D, unsigned int _row=0): array2D(_array2D), row(_row) {} T& operator[](unsigned int col) { if(col>=array2D.cols) { throw out_of_range("invalid col"); } return const_cast<Array2D<T>&>(array2D).array[row*array2D.cols+col]; } const T& operator[](unsigned int col) const { if(col>=array2D.cols) { throw out_of_range("invalid col"); } return array2D.array[row*array2D.cols+col]; } }; friend class RowArray;
//get,set函数 unsigned int getRows() const { return rows; } unsigned int getCols() const { return cols; } };
template <typename T> Array2D<T>::Array2D(unsigned int _rows, unsigned int _cols): rows(_rows), cols(_cols), array(_rows*_cols){ for(unsigned int i=0; i<rows*cols; ++i) { array[i]=T(); } }
template <typename T> Array2D<T>::Array2D(unsigned int _rows, unsigned int _cols, T data1, ...): rows(_rows), cols(_cols),array(_rows*_cols){ va_list ap; va_start(ap, _cols); for(unsigned int i=0; i<rows*cols; ++i) { array[i]=va_arg(ap, T); } va_end(ap); }
现在就可以使用它们了,如下面的测试程序: #include "Array.h" #include "Array2D.h" #include <iostream> #include <string> using std::string; using std::cout; using std::endl;
void testArray(); void testArray2D();
int main() { testArray(); testArray2D(); return EXIT_SUCCESS; }