c++ 代理与句柄

    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.很明显数据要分类,所以我们需要一个基类。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值