c++笔记17之句柄类
句柄类存储和管理基类指针。指针所指的对象的类型可以变化,即可以指向基类对戏那个又可以指向派生类类型对象。用户通过句柄类访问继承层次的操纵。因为句柄类使用指针执行操作,虚成员的行为将在运行时根据句柄实际绑定的对象的类型而变化。因此,句柄的用户可以获得动态行为但无需操心指针的管理。
包装了继承层次的句柄有两个重要的设计考虑因素
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之句柄类相关推荐
- 学习笔记----MATLAB的句柄类和实体值类
本系列内容为<MATLAB面向对象编程–从入门到设计模式>学习笔记,特此说明. Value类和Handle类 MATLAB面向对象编程中有两种类:一种叫叫做Value类(Value Cla ...
- C++ Primer 学习笔记_72_面向对象编程 --句柄类与继承[续]
面向对象编程 --句柄类与继承[续] 三.句柄的使用 使用Sales_item对象能够更easy地编写书店应用程序.代码将不必管理Item_base对象的指针,但仍然能够获得通过Sales_item对 ...
- Java变成笔记4:复用类
Java变成笔记4:复用类 图源:Java Switch语句(用法详解)-java教程-PHP中文网 类是OOP编程中的代码组织单元,无论是OOP的类还是面向过程的函数,其目的都是为了实现代码复用. ...
- Unity 入门笔记 - 05 - 动画事件类音效对话框
Unity 入门笔记 - 05 - 动画事件&类&音效&对话框 前言:无 目录 Unity 入门笔记 - 05 - 动画事件&类&音效&对话框 一.动画 ...
- 华为HCIA-datacom 学习笔记17——IPv6基础
华为HCIA-datacom 学习笔记17--IPv6基础 IPv6基础 1.ipv4与ipv6 地址长度32bit IPv6:IP地址长度128bit IPv4包头(20byte~60byte) I ...
- [C++ Primer] 第十五章的句柄类
1 为什么要使用句柄类? 句柄?windows中的句柄吗?那不是一个整数吗?不是,当然不是.句柄类应该算是C++中的一种技术,一种管理指针的技术,一种实现面向对象编程的技术. 为什么要使用句柄呢? 多 ...
- # C# 学习笔记(4) 类
C# 学习笔记(4) 类 面向对象编程主要是为了写出一个通用的代码,屏蔽差异,方便开发大型项目.类就是面向对象编程的核心之一.和C语言的结构体相比,结构体拥有的功能,类统统都有,除此之外,类还有许多新 ...
- Java程序猿的JavaScript学习笔记(10—— jQuery-在“类”层面扩展)
计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...
- AJPFX学习笔记JavaAPI之String类
学习笔记JavaAPI之String类 [size=10.5000pt]一.所属包java.lang.String,没有子类.特点:一旦被初始化就不可以被改变. 创建类对象的两种方式: String ...
- 【c++手记】句柄类智能指针
很多同学学习c++都会看的一本经典教材<Primer> 而在面向对象里面提及到一种概念-智能指针,而往往同学会出现以下的问题 [问题] 智能指针是不是一种指针? stl里面的智能指针是什么 ...
最新文章
- 2016年研究数据可视化最不应该错过的10篇文章
- python封装方法有几种_Python中的封装有什么作用?
- UVa1491 - Compress the String(dfs)
- vue中webpack默认配置_Vue-cli 中 Webpack 配置优化(一)
- jQuery基本知识
- P2386 放苹果 方法一
- 雷林鹏分享:CSS Id 和 Class
- c++ 十进制、十六进制和BCD的相互转换
- 洛谷P2234 [HNOI2002]营业额统计 set简易解法
- C++ Primer Plus学习(十一)——类和动态内存分配
- roads 用户体验标准_手持海外通行证,海信激光电视征服全球用户!
- 计算机三级 信息安全技术题库——选择题1
- 我讨厌单元测试:滕振宇谈如何进行单元测试
- Python——河神小游戏
- 带你学习如何更好的使用uni-app(一)
- Red5 Client 调用 Red5 Server
- MagikEye将在CES上展示Invertible Light™图像传感器技术
- Netgear R6220桥接组网设置
- Reactor响应式流的核心机制——背压机制
- 南邮CTF:密码学 异性相吸