more effective c++——Item M30 代理类(一)多维数组的实现
2017-05-05 01:03
561 查看
代理类:用一个类来实现我们所需要的而 C++语言中并没有提供的东西,用户并不需要该类的具体实现
总结:
1.模板类中,输入输出操作符重载不能在模板类外部实现
2.数组类需要提供基本的操作:单参构造,拷贝构造,赋值操作,输出操作符
3.n维数组类持有n-1维数组的二级指针
4.多维数组可以看作n-1维数组的叠加,构造时需要先构造row个n-1个维数组的指针,然后再次为这些指针分配空间,析构时先删除n-1维数组的内存,再删除存放指针的内存
5.不要模板类型——typename
一维数组的实现:
二维数组的实现:
三维数组的实现:
总结:
1.模板类中,输入输出操作符重载不能在模板类外部实现
2.数组类需要提供基本的操作:单参构造,拷贝构造,赋值操作,输出操作符
3.n维数组类持有n-1维数组的二级指针
4.多维数组可以看作n-1维数组的叠加,构造时需要先构造row个n-1个维数组的指针,然后再次为这些指针分配空间,析构时先删除n-1维数组的内存,再删除存放指针的内存
5.不要模板类型——typename
一维数组的实现:
#pragma once #include <iostream> //#include <afx.h> using namespace std; template<typename T> class Array1D { public: Array1D(const int size) :m_isize(size), m_array(new T[m_isize]) {} ~Array1D() { delete[] m_array; } Array1D<T> & operator=(const Array1D<T> &rhl); const T & operator[](const int index) const; T & operator[](const int index); friend ostream &operator<< (ostream & os, const Array1D<T> &rhl) { for (int i = 0; i < rhl.m_isize; ++i) { cout << rhl[i]; if (i != rhl.m_isize - 1) { cout << " "; } } cout << endl; return os; } private: int m_isize; T *m_array; }; template<typename T> inline Array1D<T> & Array1D<T>::operator=(const Array1D<T> &rhl) { if (m_array == rhl.m_array) { return *this; } delete[] m_array; m_isize = rhl.m_isize; m_array = new T[m_isize]; for (int i = 0;i < m_isize;++i) { m_array[i] = rhl.m_array[i]; } return *this; } template<typename T> inline const T & Array1D<T>::operator[](const int index) const { return m_array[index]; } template<typename T> inline T & Array1D<T>::operator[](const int index) { return m_array[index]; } inline void test_array1d() { int isize = 10; Array1D<int> arr1d(isize); for (int i = 0; i < isize; ++i) { arr1d[i] = i * 2 + 1; } cout << arr1d; }
二维数组的实现:
#pragma once #include "Array1D.h" #include <iostream> using namespace std; template<typename T> class Array2D { public: Array2D(const int row,const int col) :m_irow(row), m_icol(col) { m_array = new Array1D<T> *[m_irow]; for (int i = 0; i < m_irow;++i) { m_array[i] = new Array1D<T>(m_icol); } } ~Array2D() { for (int i = 0; i < m_irow; ++i) { delete m_array[i]; } delete[] m_array; } Array2D<T> & operator=(const Array2D<T> &rhl); const Array1D<T> & operator[](const int index) const; Array1D<T> & operator[](const int index); friend ostream &operator<< (ostream & os, const Array2D<T> &rhl) { for (int i = 0; i < rhl.m_irow; ++i) { cout << rhl[i]; } cout << endl; return os; } private: int m_irow; int m_icol; Array1D<T> **m_array; }; template<typename T> inline Array2D 4000 <T> & Array2D<T>::operator=(const Array2D<T> &rhl) { if (m_array == rhl.m_array) { return *this; } for (int i = 0; i < m_irow; ++i) { delete m_array[i]; } delete[] m_array; m_irow = rhl.m_irow; m_icol = rhl.m_icol; m_array = new Array1D<T> *[m_irow]; for (int i = 0; i < m_irow; ++i) { m_array[i] = new Array1D<T>(m_icol); *m_array[i] = *rhl.m_array[i]; } return *this; } template<typename T> inline const Array1D<T> & Array2D<T>::operator[](const int index) const { return *m_array[index]; } template<typename T> inline Array1D<T> & Array2D<T>::operator[](const int index) { return *m_array[index]; } inline void test_array2d() { int row = 5; int col = 7; Array2D<int> arr2d(row,col); for (int i = 0; i < row; ++i) { for (int j = 0 ;j < col;++j) { arr2d[i][j] = i + i*j; } } cout << arr2d; }
三维数组的实现:
#pragma once #include "Array2D.h" #include <iostream> using namespace std; template<typename T> class Array3D { public: Array3D(const int len, int wid, int hight) :m_len(len), m_wid(wid), m_hight(hight) { m_array = new Array2D<T> *[len]; for (int i = 0;i < len;++i) { m_array[i] = new Array2D<T>(wid, hight); } } ~Array3D() { for (int i = 0; i < m_len; ++i) { delete m_array[i]; } delete[] m_array; } Array3D<T> & operator=(const Array3D<T> &rhl); const Array2D<T> & operator[](const int index) const; Array2D<T> & operator[](const int index); friend ostream &operator<< (ostream & os, const Array3D<T> &rhl) { for (int i = 0; i < rhl.m_len; ++i) { cout << rhl[i]; } cout << endl; return os; } private: int m_len; int m_wid; int m_hight; Array2D **m_array; }; template<typename T> const Array2D<T> & Array3D<T>::operator[](const int index) const { return *m_array[index]; } template<typename T> inline Array2D<T>& Array3D<T>::operator[](const int index) { return *m_array[index]; } template<typename T> inline Array3D<T>& Array3D<T>::operator=(const Array3D<T>& rhl) { if (m_array == rhl.m_array) { return *this; } for (int i = 0; i < m_len; ++i) { delete m_array[i]; } delete[] m_array; m_len = rhl.m_len; m_wid = rhl.m_wid; m_hight = rhl.m_hight; m_array = new Array2D<T> *[m_len]; for (int i = 0; i < m_irow; ++i) { m_array[i] = new Array2D<T>(m_wid,m_hight); *m_array[i] = *rhl.m_array[i]; } return *this; }
相关文章推荐
- more effective c++——Item M30 代理类(三)隐式类型转换与代理类
- more effective c++——Item M30 代理类(二)通过代理类识别operator[]的读写操作
- 《more effective c++》Item M3:不要对数组使用多态
- (大卫的阅读笔记)More Effective C++ Item 附2:一个auto_ptr的实现实例
- more effective c++之Item M3:不要对数组使用多态
- more effective c++——Item M29 引用计数(二)带静态成员变量的rfstring类实现
- more effective c++——Item M29 引用计数(三)带引用计数的基类的实现
- More Effective C++ Item 附2:一个auto_ptr的实现实例
- More Effective C++:Item 27
- More Effective C++ 读书摘要(auto_ptr的一个实现)
- More Effective C# Item7 : 不要为基类或者接口创建泛型的特殊实现
- More Effective C++ 条款3 绝对不要以多态(polymorphically)方式处理数组
- Item 2:Prefer C++-style casts.(More Effective C++)
- 《more effective c++》Item M1:指针与引用的区别
- More effective C++ 今日一贴 - 绝不要把多态应用与数组[3]
- 《More effective C++》 中条款三 不要用多态方式处理数组以及数组的析构
- More Effective C++议题【三】:不要对数组使用多态
- 《more effective c++》Item M5:谨慎定义类型转换函数
- More Effective C++ 读书摘要(五、技巧2)Item28 - 29
- More Effective C++ 读书摘要(五、技巧1)Item25 - 27