句柄类存储和管理基类指针。指针所指的对象的类型可以变化,即可以指向基类对戏那个又可以指向派生类类型对象。用户通过句柄类访问继承层次的操纵。因为句柄类使用指针执行操作,虚成员的行为将在运行时根据句柄实际绑定的对象的类型而变化。因此,句柄的用户可以获得动态行为但无需操心指针的管理。

包装了继承层次的句柄有两个重要的设计考虑因素

1,像对任何保存指针的类一样。必须确定对复制控制做些什么。包装了继承层次的句柄通常表现的像一个只能指针或像一个值。

2,句柄类决定句柄接口屏蔽还是不屏蔽继承层次,如果不屏蔽继承层次,用户必须了解和使用基本层次中的对象。

我们将定义名为Sale_item的指针型句柄类,表示Item_base层次,Sales_item的用户将像使用指针一样使用它:将用户Sals_item绑定到Item_base类型的对象并使用*和—>操作符执行Item_base的操作。

例如:Sale_item item(Bulk_item("0-102-34529",35,4,43));

item->net_price();//item像是指针一样。

用户可以不必管理句柄指向的对象,Sales_item类将完成这部分工作。当用户通过Sales_item类对像那个调用函数式,将获得多态行为。

Sales_item类将有两个数据成员,都是指针,一个指针将指向Item_base对戏那个,而另一个将指向使用计数,Item_base指针可以指向Item_base 也可以指向Item_base 派生类类型的对象,通过指向使用计数,多个Sale_item对象可以共享同一个计数器。

class Sales_item
{
public:Sales_item():p(0),use(new size_t(1)){}Sales_item(const Item_base&);Sales_item(const Sales_item &i):p(i.p),use(i.use){++*use;   }~Sales_item(){dec_use();};Sales_item& operator=(const Sales_item&);const Item_base *operator->()const{if(p) return p;}const Item_base&  operator*()const{if(p) return *p;}
private:Item_base *p;size_t *use;void dec_use(){if(--*use==0){delete p;delete use;}}};
Sales_item& Sales_item::operator=(const Sales_item& i)
{++*i.use;dec_use();p=i.p;use=i.use;return *this;}

要实现Item_base对象的构造函数,必须首先解决一个问题:我们不知道给予构造函数的对象的实际类型,我们知道他是一个Item_base对象或者是它的派生类的对象,句柄类经常需要在不知道对象的确切类型是分配一直对象的新副本。解决这个问题的通用方法是定义虚操作进行赋值,我们称将该操作clone

class Item_base
{
public:virtual Item_base* clone()const{return new Item_base(*this);}
};
class Bulk_item:public Item_base
{public:Bulk_item* clont()const{return new Bulk_item(*this);}};
Sales_item::Sales_item(const Item_base &item):p(item.clone()),use(new size_t(1)){}

像默认构造函数一样,这个构造函数分配并初始化使用计数,它调用形参的clone产生那个对象的虚副本,如果实参是Item_base对象,则运行Item_base的clone函数。如果是Bulk_item对象则执行它的clone函数。

c++笔记17之句柄类相关推荐

  1. 学习笔记----MATLAB的句柄类和实体值类

    本系列内容为<MATLAB面向对象编程–从入门到设计模式>学习笔记,特此说明. Value类和Handle类 MATLAB面向对象编程中有两种类:一种叫叫做Value类(Value Cla ...

  2. C++ Primer 学习笔记_72_面向对象编程 --句柄类与继承[续]

    面向对象编程 --句柄类与继承[续] 三.句柄的使用 使用Sales_item对象能够更easy地编写书店应用程序.代码将不必管理Item_base对象的指针,但仍然能够获得通过Sales_item对 ...

  3. Java变成笔记4:复用类

    Java变成笔记4:复用类 图源:Java Switch语句(用法详解)-java教程-PHP中文网 类是OOP编程中的代码组织单元,无论是OOP的类还是面向过程的函数,其目的都是为了实现代码复用. ...

  4. Unity 入门笔记 - 05 - 动画事件类音效对话框

    Unity 入门笔记 - 05 - 动画事件&类&音效&对话框 前言:无 目录 Unity 入门笔记 - 05 - 动画事件&类&音效&对话框 一.动画 ...

  5. 华为HCIA-datacom 学习笔记17——IPv6基础

    华为HCIA-datacom 学习笔记17--IPv6基础 IPv6基础 1.ipv4与ipv6 地址长度32bit IPv6:IP地址长度128bit IPv4包头(20byte~60byte) I ...

  6. [C++ Primer] 第十五章的句柄类

    1 为什么要使用句柄类? 句柄?windows中的句柄吗?那不是一个整数吗?不是,当然不是.句柄类应该算是C++中的一种技术,一种管理指针的技术,一种实现面向对象编程的技术. 为什么要使用句柄呢? 多 ...

  7. # C# 学习笔记(4) 类

    C# 学习笔记(4) 类 面向对象编程主要是为了写出一个通用的代码,屏蔽差异,方便开发大型项目.类就是面向对象编程的核心之一.和C语言的结构体相比,结构体拥有的功能,类统统都有,除此之外,类还有许多新 ...

  8. Java程序猿的JavaScript学习笔记(10—— jQuery-在“类”层面扩展)

    计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...

  9. AJPFX学习笔记JavaAPI之String类

    学习笔记JavaAPI之String类 [size=10.5000pt]一.所属包java.lang.String,没有子类.特点:一旦被初始化就不可以被改变. 创建类对象的两种方式: String ...

  10. 【c++手记】句柄类智能指针

    很多同学学习c++都会看的一本经典教材<Primer> 而在面向对象里面提及到一种概念-智能指针,而往往同学会出现以下的问题 [问题] 智能指针是不是一种指针? stl里面的智能指针是什么 ...

最新文章

  1. 2016年研究数据可视化最不应该错过的10篇文章
  2. python封装方法有几种_Python中的封装有什么作用?
  3. UVa1491 - Compress the String(dfs)
  4. vue中webpack默认配置_Vue-cli 中 Webpack 配置优化(一)
  5. jQuery基本知识
  6. P2386 放苹果 方法一
  7. 雷林鹏分享:CSS Id 和 Class
  8. c++ 十进制、十六进制和BCD的相互转换
  9. 洛谷P2234 [HNOI2002]营业额统计 set简易解法
  10. C++ Primer Plus学习(十一)——类和动态内存分配
  11. roads 用户体验标准_手持海外通行证,海信激光电视征服全球用户!
  12. 计算机三级 信息安全技术题库——选择题1
  13. 我讨厌单元测试:滕振宇谈如何进行单元测试
  14. Python——河神小游戏
  15. 带你学习如何更好的使用uni-app(一)
  16. Red5 Client 调用 Red5 Server
  17. MagikEye将在CES上展示Invertible Light™图像传感器技术
  18. Netgear R6220桥接组网设置
  19. Reactor响应式流的核心机制——背压机制
  20. 南邮CTF:密码学 异性相吸

热门文章

  1. P-NUCLEO-IHM001 板载STLINK 驱动安装
  2. 爱玩软件 | win10桌面美化
  3. 2021年广东省安全员A证第三批(主要负责人)考试内容及广东省安全员A证第三批(主要负责人)新版试题
  4. Chrome 谷歌浏览器安装Axure插件
  5. linux 摄像头yuv,camera YUV格式
  6. c++ makefile编写
  7. Opencv摄像头相关参数
  8. NRF24L01详解
  9. activiti7---候选人
  10. C++函数模板(模板函数)详解