【more effective c++读书笔记】【第5章】技术(6)——Proxy classes(代理类)

“用来代表其他对象”的对象被称为proxy objects,用来表现proxy objects者,称为proxy classes(代理类)。

一、实现二维数组

//Array2D.h
#ifndef ARRAY2D_H
#define ARRAY2D_H
//代理类
template
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
class Array2D{
public:
	Array2D(int d1, int d2):dim1(d1),dim2(d2){ //构造函数,T必须有默认构造函数
		void* raw = ::operator new[](dim2*sizeof(Array1D(dim1)));//分配原始内存
		data2d = static_cast*>(raw);//data2d指向原始内存,并使这块内存被当做Array1D数组
		for (int i = 0; i < dim2; ++i)//利用placement new构造内存中的Array1D对象
			new (data2d + i) Array1D(dim1);
	}
	Array2D(const Array2D& rhs):dim1(rhs.dim1),dim2(rhs.dim2){//深拷贝构造函数
		void* raw = ::operator new[](dim2*sizeof(Array1D(dim1)));
		data2d = static_cast*>(raw);
		for (int i = 0; i < dim2; ++i)//利用placement new拷贝构造内存中的Array1D对象
			new (data2d + i) Array1D(rhs.data2d[i]);
	}
	~Array2D(){//析构函数,没有用new来创建data2d数组,就不能直接用delete[]来删除data2d 
		for (int i = 0; i(); //显式调用析构函数销毁各个对象  
		::operator delete[](static_cast(data2d)); //释放内存  
	}
	Array1D& operator[](int index){ return data2d[index]; }//重载[]运算符,非const版本
	const Array1D& operator[](int index) const { return data2d[index]; }//重载[]运算符,const版本
	int getLength1(){ return dim1; }//返回数组第一维长度
	int getLength2(){ return dim2; }//返回数组第二维长度
private:
	int dim1;
	int dim2;
	Array1D* data2d;
};

#endif
//main.cpp
#include"Array2D.h"
#include
using namespace std;

int main(){
	Array2D data(10, 20);
	int count = 0;
	

你可能感兴趣的:(more,effective,c++)