代理类:用一个类来实现我们所需要的而 C++语言中并没有提供的东西,用户并不需要该类的具体实现
总结:
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<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;
}