“用来代表其他对象”的对象被称为proxy objects,用来表现proxy objects者,称为proxy classes(代理类)。
一、实现二维数组
//Array2D.h
#ifndef ARRAY2D_H
#define ARRAY2D_H
//代理类
template<typename T>
class Array1D{
public:Array1D(int d) :dim(d),data1d(new T[dim]){}//构造函数,T必须有默认构造函数Array1D(const Array1D& rhs):dim(rhs.dim),data1d(new T[dim]){//深拷贝构造函数for (int i = 0; i < dim; ++i)data1d[i] = rhs.data1d[i];}~Array1D(){ delete[] data1d; }//析构函数T& operator[](int index){ return data1d[index]; }//重载[]运算符,非const版本const T& operator[](int index) const { return data1d[index]; }//重载[]运算符,const版本int getLength(){ return dim; }//返回一维数组长度
private:int dim;T* data1d;
};template<typename T>
class Array2D{
public:Array2D(int d1, int d2):dim1(d1),dim2(d2){ //构造函数,T必须有默认构造函数void* raw = ::operator new[](dim2*sizeof(Array1D<T>(dim1)));//分配原始内存data2d = static_cast<Array1D<T>*>(raw);//data2d指向原始内存,并使这块内存被当做Array1D<T>数组for (int i = 0; i < dim2; ++i)//利用placement new构造内存中的Array1D<T>对象new (data2d + i) Array1D<T>(dim1);}Array2D(const Array2D& rhs):dim1(rhs.dim1),dim2(rhs.dim2){//深拷贝构造函数void* raw = ::operator new[](dim2*sizeof(Array1D<T>(dim1)));data2d = static_cast<Array1D<T>*>(raw);for (int i = 0; i < dim2; ++i)//利用placement new拷贝构造内存中的Array1D<T>对象new (data2d + i) Array1D<T>(rhs.data2d[i]);}~Array2D(){//析构函数,没有用new来创建data2d数组,就不能直接用delete[]来删除data2d for (int i = 0; i<dim2; ++i)data2d[i].~Array1D<T>(); //显式调用析构函数销毁各个对象 ::operator delete[](static_cast<void*>(data2d)); //释放内存 }Array1D<T>& operator[](int index){ return data2d[index]; }//重载[]运算符,非const版本const Array1D<T>& operator[](int index) const { return data2d[index]; }//重载[]运算符,const版本int getLength1(){ return dim1; }//返回数组第一维长度int getLength2(){ return dim2; }//返回数组第二维长度
private:int dim1;int dim2;Array1D<T>* data2d;
};#endif
//main.cpp
#include"Array2D.h"
#include<iostream>
using namespace std;int main(){Array2D<int> data(10, 20);int count = 0;