初次邂逅句柄类 --C++ primer

句柄类存储和管理基类指针
指针所指对象的类型可以变化,既能指向基类类型对象又可以指向派生类类型对象。
用户通过句柄类访问 继承层次的操作 (virtual 函数)


设计考虑因素:
       1)对任何保存指针的类一样,必须确定对复制控制的具体操作。包装了继承层次的句柄应该表现得像一个智能指针或者像一个值
       2)句柄类决定句柄接口屏蔽还是不屏蔽继承层次。 如果不屏蔽 继承层次,用户必须了解和使用基本层次中的对象。


指针型句柄
           1,定义句柄:  
                       三个构造函数: 默认构造函数 复制构造函数   接受指向基类对象的构造函数 ,第三个构造函数将复制基类对象,并保证: 基类对象存在,副本就存在
                        两个数据成员: 都是指针, 一个指针指向  基类对象 ; 一个指向  使用计数 (多个句柄共享一个计数器)
                        重载操作符:     解引用操作符:返回 基类指针指向的对象(基类或派生类);
                                                  箭头操作符:返回基类指针

          2, 使用计数式复制控制:  和智能指针差不多

              3, 构造句柄    
                     两个构造函数: 默认构造函数创建未绑定(即该基类指针值为0)的 句柄对象;
                                             上面三个构造函数的第三个(涉及到复制未知类型的操作)因为这构造函数的形参是一个基类的引用,而要根据这个操作创建这个对象的副本, 这个引用是基类的引用,但是可能存储的是派生类的对象。所以,这个基类需要一个接口,可以返回这个引用实际指向的对象,这个涉及到动态绑定-> 什么可以解决过动态绑定 -> 虚函数。所以,下面就是讨论这个虚函数clone.




复制未知类型    解决这个问题 的通用方法是定义虚操作进行复制,该操作命名为clone
                            基类添加一个clone 函数,为virtual 函数。 继承层次的每个类型都要增加clone函数
                            clone 函数 : 返回类型: 以本类为副本 构造一个 对象 ,返回指针值。  return new 类名(*this)

                          通过定义clone 函数,上面的第二个构造函数,只要用形参的基类引用调用clone 函数 就能返回 形参对象副本的指针。
            回顾: 虚函数要求基类和派生类里面要完全匹配,但是返回类型可以是基类或派生类,这里明显就显示其大大的前瞻性!!!




      

个人体会: 我觉得句柄的使用 就是对 C++ 动态绑定的 应用。
                   C++ 的动态绑定需要两个条件: 1) 继承与虚函数 ;2) 使用基类指针或引用。

                   所以在程序中用到的最好是基类的指针,然后通过指针去调用虚函数,可以根据具体不同的对象执行各种的虚函数,而单独用指针的话会增加用户的负担,比如指针指向的内存的 申请、释放, 这些指针之间的复制,赋值。所有这些如果都散开来做,将会很蛋疼,所以把这些操作集中起来处理,就有了智能指针和句柄类这样的东西。


                    所以句柄类 主要要解决的操作有: 怎么通过一个 基类的指针 或 引用(里面存储的可能是基类对象 或 派生类对象)去构造本身 存储指针指向的副本? 就是上面所说的第三个构造函数。 (回顾: 派生类指针或引用可以默认转换到 基类指针或引用,牢牢记住)
            复制控制(三种函数一般都要包括)
                    复制构造函数: 形参为句柄类本身引用的构造函数(注意计数指针的变化);
                    重载赋值操作符:注意计数指针的变化
                    析构函数: 复制释放基类指针的内容, 和 计数指针合作,决定什么时候应该删除基类 

纯属个人胡扯,有不对的地方,各位大爷不吝赐教

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值