1代理
考虑一个问题:
表示交通工具的基类是Vehicle,子类有RoadVehicle, AutoVehicle,……如果想处理一系列不同的Vehicle,我们用什么来表示呢?
尝试1:Vehicle Parking_lot[1000];
可是Vehicle是一个虚基类!
即使Vehicle不是一个虚基类,语句RoadVehicle x, Parking_lot[n]= x;有用么?!!!
尝试2:Vehicle* Parking_lot[1000];
1)这样,我们可以写出如下语句:
RoadVehicle * x = new RoadVehicle;
Parking_lot[n]= x ;可是一旦x析构,Parking_lot[n]就不会有意义了。
2)我们也可以这样写:
Parking_lot[n]= new RoadVehicle; 可是如果Parking_lot[n],Parking_lot[m]指向同一个指针怎么办呢?如何释放?
解决方案是:定义一个代理类vehiclesurrogate,用这个类来完成工作。vehiclesurrogate Parking_lot[1000];
vehiclesurrogate到底要完成什么工作。
1.vehiclesurrogate要能够复制某个Vehicle子类:RoadVehicle x; Parking_lot[n]=x;(Vehicle 子类中要实现 copy操作,返回复制好的指针给vehiclesurrogate 内部Vehicle *)
2,代理Vehicle的操作。
3.析构函数释放Vehicle的指针。
2. 句柄
上面我们讨论的是代理Vehicle子类的操作,如何我们代理Vehicle子类的指针的操作呢,对了,这就是句柄提供的功能.
句柄用引用计数来记录有多少个句柄在引用相同的数据,如下图。
当然,更好的句柄结构如下图所示:
3,思考1
想想看,智能指针是不是一个句柄呢?!
auto_ptr详解 :
http://blog.csdn.net/chyuanzheng/article/details/7832416
4.思考2
我们考虑下面一个问题:
int main()
{
Expr t = Expr("*", Expr("-", 5),Expr("+", 3, 4));
cout << t << endl;
t = Expr("*", t, t);
}
输出为
((-5))*(3+4));
(((-5))*(3+4))*((-5))*(3+4)));
想想看,如何利用句柄实现上面的功能呢?
提示:
1.很明显Expr是一个句柄。
因为句柄可以代理数据的操作,并且管理数据,特别是能够协助释放数据的资源。
那么如何构造数据的class呢?
2.很明显数据要分类,所以我们需要一个基类。