Handle标识解析系统-技术篇
- 格式:pptx
- 大小:2.52 MB
- 文档页数:52
句柄编译原理句柄(Handle)是编译原理中一个重要的概念,它在编程语言和编译器中扮演着至关重要的角色。
本文将从句柄的定义、作用、实现方式以及在编译原理中的应用等方面进行详细介绍。
首先,句柄是指对数据或对象的引用,它是一个抽象的概念,用来表示一个特定的资源或实体。
在编程语言中,句柄通常用来指代对内存中某个对象的引用,而不是对象本身。
通过句柄,程序可以间接地访问和操作对象,从而实现对对象的管理和控制。
句柄的作用非常广泛,它可以用来表示各种资源,如窗口、文件、内存块等。
通过句柄,程序可以方便地管理这些资源,实现资源的共享和保护。
句柄还可以用来实现数据的抽象和封装,提高程序的灵活性和可维护性。
在编译原理中,句柄通常用来表示对符号表中符号的引用。
符号表是编译器中的一个重要数据结构,用来存储程序中出现的各种标识符(如变量、函数名等)及其属性。
通过句柄,编译器可以方便地访问和操作符号表中的符号,实现对程序的分析和转换。
句柄的实现方式有多种,常见的包括指针、引用和句柄表等。
指针是最直接的句柄实现方式,它直接指向对象的内存地址。
引用是对指针的一种封装,提供了更安全和方便的访问方式。
句柄表是一种间接寻址的方式,通过一个索引来访问对象,实现了对象的动态分配和管理。
在编译原理中,句柄通常用来表示对符号表中符号的引用。
符号表是编译器中的一个重要数据结构,用来存储程序中出现的各种标识符(如变量、函数名等)及其属性。
通过句柄,编译器可以方便地访问和操作符号表中的符号,实现对程序的分析和转换。
总之,句柄是编译原理中一个重要的概念,它在编程语言和编译器中扮演着至关重要的角色。
通过句柄,程序可以方便地管理和操作各种资源,实现程序的灵活性和可维护性。
在编译原理中,句柄通常用来表示对符号表中符号的引用,实现对程序的分析和转换。
希望本文的介绍能够帮助读者更好地理解句柄在编译原理中的作用和应用。
Handle互联网标识体系产业应用(本文根据工信部电子科技情报研究所信息化研究与促进中心主任周剑在2015中国两化融合大会的发言整理,未经本人审阅)新技术的发展导致整个产业发展、整个经济转型,导致了整个生产生活新模式的诞生。
在变革里最重要的就是IT技术,而在IT技术里,在当前的历史条件下,最重要的是网络技术。
下一个时代有可能是智能技术,但是真正从广度和深度上来讲,网络技术是恰逢其时,在深刻变革着我们的社会,所以我们下一步变革应该抓住什么?就是在网络技术应用这方面要下大力气,要下工夫。
网络技术带来什么变革呢?首先我个人理解它会对整个未来的技术架构,应用架构,对我们整个社会体系的经济产业的架构带来巨大的变革。
我们过去最底下是物理层、设备层,上来就是数据库、应用等等。
在网络技术飞速发展的情况下,比如解析技术发展的基础上,底下是物理层,中间应该有一层数据的解析服务,是用互联网的架构在应用和物理层之间要多加一层,这是真正的网络架构,把解析技术引进来,这样应用和设备之间就不会像过去那样那么复杂,我们的系统未来就不需要做那么多接口。
我们都在讲未来的世界是网络世界,未来的组织是网络化的组织等等,它的根源是什么?我们现在每个企业都有自己的边界,每个组织都有自己的边界。
比如像我,我是情报所的一个员工,我不再可能是另外一个机构全职的员工。
企业也是一样,企业是工业文明的产物,当时是为了提高效率,降低交易成本,所以有了企业这样的组织,使得内部交易成本更低。
但是在网络化资源配置的条件下,在网络化组织体系里,我们是不需要这样的边界,所以我们要打破组织边界,打破企业边界。
工业时期是因为分工,是因为技术和产品这种专业的分工,所以导致各种各样组织边界的出现和供应链的出现,但是未来还是这样吗,可能不是了。
这里很核心的一个东西是需要加入一个网络服务这一层,真正的网络服务这一层。
当前很重要的一点是要有一套解析服务体系,DNS在互联网应用里域名管理的DNS就是提供这样一种服务,但是DNS解析的是域名,提供的是域名解析,所以它是解决了人联网的问题。
Android 项目实例解析handle用法1.布局文件Res/layout 下:main.xml文件代码如下<?xml version="1.0"encoding="utf-8"?><LinearLayout xmlns:android="/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent"android:orientation="vertical"><TextViewandroid:id="@+id/tvCount"android:layout_width="fill_parent"android:layout_height="wrap_content"android:textSize="20dp"/><Buttonandroid:id="@+id/btnStart"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="开始计数"/><Buttonandroid:id="@+id/btnStop"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="停止计数"/><Buttonandroid:id="@+id/btnShowToast"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="15秒后显示Toast信息框"/></LinearLayout>handle.xml文件代码如下<?xml version="1.0"encoding="utf-8"?><LinearLayout xmlns:android="/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent"android:orientation="vertical"><TextViewandroid:id="@+id/tv"android:layout_width="fill_parent"android:layout_height="wrap_content"android:textSize="20dp"/></LinearLayout>2.程序代码我的项目名称HandleTest 包名com.example.handletest。
Handle system 的基本概念和功能Handle system,句柄系统,是一个多用途的全球命名服务,用来在公众Internet网上进行安全的名字解析和管理.它是一个分布式的信息系统,包括开放式协议,命名空间,和一对协议实现的引用,这个协议使分布式计算机系统存储数字对象和服务的HANDLE,把这些HANDLE解析成必要的信息形式,以便定位,获取,和充分利用.这些相关联的属性能够按需改变,来反映确定资源的当前状态,而不用改变它的Handle值.这样一来,就可以保证数据对象的命名持久性,使其分离于该数据对象的位置及其它当前状态属性的改变.Handle system架构从本质上讲,Handle system实际上是一个对象和服务的命名服务.它包括两大部分.数字对象的命名和服务的提供.1.handle的命名空间每个handle都有自己的命名空间,每个handle包括两部分命名权,或者称为它的前缀.以及在命名权之下的一个本地名字.或者称为它的后缀.命名权和本地名字被ASCII字符“/“所分割.格式:<Handle>::=<Handle Naming Authority>"/"<Handle Local Name>2.提供的服务Handle系统中定义了一个分级服务模式.最上层是一个单独的全球服务,称为global Handle registry.以下各层包括了所有其他的Handle服务,一般称作本地 Handle 服务.Globalhandleregistry 提供了一个全球 Handle 服务(解析)且能用来管理任何命名空间.由于它提供了管理 Handle 命名权的名字空间,因此它在 Handle 服务中是唯一的,这些命名权的 Handle 的状态信息就是所谓的服务信息,客户机既可以向全球 handle service 或本地 handle service 提出解析请求,用来获取和利用相关的服务.其优化策略基于时间和准确度的折衷.3.handle system几大要素唯一性,持久性,实例性,扩展的命名空间,分布式服务模式,安全的命名服务,高效的解析服务一个简单的Handle system原型的实现数据结构描述:(HTTP协议为背景)首先定义一些函数集对Handle system的两大数据库( Handle 数据库和 Handle 管理数据库)进行基本操作.Add_name—authority (添加命名权)Delete_name—authority (删除命名权)Add-handle(添加handle)Delete_handle(删除 handle)Add-value (添加 handle的绑定值)Delete-Value(删除 handle 的绑定值)Modify-Value (修改 handle的绑定值)在该数据模型中,我们定义了一个提供名字解析服务存储在 SERVER 端的数据模型.由该图易知,它主要包括了 Handle 协议的版本信息,服务器端由几台 server 分担负载,每台物理上的 SERVER 的实际地址,鉴权算法等等.最重要的是它的两种服务模式,一种是单纯的解析模式,将用户给出的 Handle 定位到对应的 repository.另一种则是根据用户的需求,把repository中的数字对象直接返回给用户或给出相应的解决方法.这一部分虽然从总体架构上而言,应该属于接口网关,即和用户交互的部分.实现流程描述:假设北邮的 MMIT 实验室命名权为 BUPT.MMIT,HANDLE 的命名服务为 HAN,SER..我们想要一篇 BUPT,MMIT下的document.1.如客户端在对数字对象的操作时,会有相应的鉴权过程,以确保Handle值的可靠性.2.一般而言,客户端在发出请求时,会首先向全球注册机构发出请求.假设本地存在有缓冲服务器,因此请求步骤相应简化.3.服务器端的证实功能是为了确保客户端得到的是最新的Hash table.4.本来由应用网关处理的返回数字对象功能以由Handle system接管,以增加解析效率.和DNS服务的区别及体现的优点DNS(Domain Name Service) 原先是被用来将域名映射成”地址进行网络路由.随着 Internet 的增长,对 DNS 提出了各种各样的扩展需求,甚至希望它成为一个多用途的资源命名系统,可是,任何那样的使用必然会导致网络解析 IP 地址速度的降低以及修改网络路由的有效性.典型的,当有大量数据和某个DNS 名字联系在一起口才,DNS 的执行并不能扩展的很好.通常,我们认为 DNS 不适合于对大量DNS 名字资源的支持.另一个引起争论的因素是,DNS 作为一个多用途的命名系统,它的管理模型不能适应需求.DNS 采用集中管理模式,并不提供命名管理结构.除了网络管理员之外,并不提供任何设施来管理命名.这对于域名管理是合适的,但对于 Internet 上大量数字对象的命名并不适合.因此,Handle 系统和 DNS 相比在分布式管理,服务模型,以及安全协议等方面有区别.。
分析Technology AnalysisDI G I T C W 技术84DIGITCW2019.09物联网的通信技术与物联网物体的价值是目前物联网在发展的过程中遇到的两个基础问题。
而物联网物体的价值问题是推动物联网发展的中心问题,主要是对为什么万物互联或是万物互联产生的价值进行分析。
物联网是由许多部分组成,其中最重要的两个部分是智能制造以及工业互联网,在世界经济格局的变化下,各国对于这两个组成部分的发展越来越重视,特别是中国、美国等国家为代表,世界上的重要经济大国对于这个领域都在不断地增加研究和投入,希望能够通过先进的技术提高制造业的生产效率,以及加强国家自身制造业的竞争水平。
每个国家都有自身的战略,我国的目标是希望将互联网与工业结合在一起进行创新,促进网络和工业结合的发展,利用新技术推动传统制造行业的发展。
运用智能化制造所涉及到的各类割裂数据的理解和应用是未来工业互联网关键技术及应用方向之一,但是要想对各类数据掌握和理解并不是一件容易的事情,需要对数据的开始、过程以及用途都有认识并了解,目前能够达到这个要求的技术就是标识解析技术。
所以,标识解析技术在现在工业互联网中的应用受到了很多关注。
1 标识解析技术的简介(1)标识解析技术的分类。
在各类的物体上或是客观对象所具有的差别于其他事物的名称标记,这就是标识的主要内容,标记的内容可以是数字、字母以及符号文字等。
目前有几种技术都使用了标识解析技术,分别是Handle 、OID 、Ecode 和EPC 等技术。
这几种技术是不同的机构研发出来的,并且适用的范围和功能等都是不一样的,但是这些技术主要都是对客观现象进行解读并做出标记,还能够有相对应信息的查询以及浏览信息的工作技术。
目前最主要的三种标识解析技术主要是Handle 、Ecode 、OID 。
(2)标识解析技术在工业互联网中的运用。
标识解析技术之所以越来越被人们所重视,是因为其能够给企业生产的信息管理系统、资源控制系统和网络等系统提供所需要的数据,让企业能够更方便地进行运营,并且标识解析技术还能够管理和控制目标对象。
手柄树(Handle Tree)是一种树状数据结构,用于管理句柄(handle)和对象之间的映射关系。
每个节点包含一个句柄和对应的对象。
手柄是对象的唯一标识符,系统可以通过句柄快速地定位到对象所在的位置,而不需要遍历整个树。
这大大提高了操作的效率。
手柄树的核心操作包括插入、删除和查找。
插入操作将一个对象添加到手柄树中。
首先,系统分配一个新的节点,并生成一个唯一的句柄。
然后,将对象和句柄关联,并将节点插入到正确的位置,以保持树的有序性和平衡性。
删除操作将一个对象从手柄树中移除。
首先,系统找到对象对应的节点,并删除它。
然后,系统根据需要进行额外的调整,以保持树的有序性和平衡性。
查找操作根据句柄查找对应的对象。
系统通过句柄可以快速地定位到对象所在的节点,并返回对象的引用。
手柄树的优势在于它能提供高效的插入、删除和查找操作。
由于手柄是对象的唯一标识符,系统可以通过句柄直接定位到对象所在的位置,而不需要遍历整个树。
这大大提高了操作的效率。
此外,手柄树还能保证对象的唯一性。
由于句柄是唯一的,系统插入对象时可以检查句柄的重复性,避免重复插入相同的对象。
这有助于确保数据的正确性和一致性。
手柄树还能提供高效的动态调整能力。
由于对象的数量是动态变
化的,系统可能需要频繁地进行插入和删除操作。
手柄树通过合理的调整策略,能够快速地适应变化,保持树的结构平衡和有序。
需要注意的是,手柄树的设计和实现需要考虑多线程环境下的并发问题。
在多线程环境下,可能存在多个线程同时对树进行操作的情况。
SYS PRACTICE 系统实践一、Handle 系统简介Handle 系统是一个分布式信息系统,旨在为互联网提供高效、可扩展和安全的全局名称服务。
Handle 系统包括了开源协议、名称空间和协议的引用实现。
其协议使分布式计算机系统能够存储数字资源的名称或标识(Handle,或称句柄),并将这些Handle解析为定位、访问和以其他方式使用资源所需的信息。
这种标识方法的特点是可以根据需要来更改Handle的关联值,以反映已标识资源的当前状态,而无须更改Handle命名本身。
这允许标识的名称在位置和其他当前状态信息更改期间保持不变。
每条Handle可以有自己的管理员,可以在分布式环境中进行管理。
该系统还可以在客户端请求时提供数据机密性、数据完整性和不可否认性等安全服务。
Handle 系统从一开始就被设计为一种通用命名服务。
它的目的是容纳大量的实体,并允许在公共互联网上进行分布式管理。
Handle 系统的数据模型可以通过定义每个与给定Handle相关联的数据值的级别来控制访问权限。
由此,每个Handle可以进一步定义自己的一组管理员,这些管理员独立于网络或主机管理员。
Handle 系统的设计目标如下[1]:(1)唯一性:Handle 系统中的每个Handle都是全局唯一的。
(2)持久性:Handle可以用作互联网资源的持久性标识符。
Handle不必派生自它所命名的实体。
为了方便起见,Handle中可以包含现有的名称,甚至是助记符,但是Handle 和它所命名的实体之间的惟一操作连接是在Handle 系统中维护的。
其持久性表现的一个方面在于允许标识的名称在位置和其他当前状态信息更改期间保持不变。
(3)多实体:一个Handle可以引用一个资源的多个实体,这些实体可能位于网络中不同的或者变化的位置。
应用程序可以利用这一点来提高性能和可靠性。
例如,网络服务可以用一个Handle为其服务定义多个入口点,以便分配服务负载。
浅析Handle服务器及其数据类型作者:李世强王霞董晓来源:《数字技术与应用》2019年第09期摘要:解释了Handle服务器的组成和定义,Handle命名空间的语法及语义结构。
详细说明了Handle系统的数据类型,包括Handle值的设定和预定义数据类型,为今后搭建Handle服务器提供参考。
关键词:Handle服务器;命名空间;数据类型中图分类号:TP393.08 文献标识码:A 文章编号:1007-9416(2019)09-0087-01Handle system是一个通用的分布式名称服务系统,它包括一套开放的系统协议,唯一标识符名称空间以及协议的参考实现模型。
与其它的解析系统或机制相比,Handle系统具有几大优势:命名系统灵活,与URN兼容,可保持标识符的唯一性及持久性;基于Handle的命名机制可以包容现有的标识符方案;对单个Handle可实现多重解析;Handle命名和Handle Protocol均实现国际化支持。
以下以Handle system为主要研究对象,对其架构组成、数据类型等进行分析阐述。
1 Handle服务器Handle系统是一个分布式全局服务器。
它由一个分布式全球Handle服务器(GHR)和无限数量的本地服务器(LHS)组成。
这些服务组件代表Handle系统为客户机组件提供名称服务(包括解析和管理)。
为了提高效率,Handle系统客户端组件也可以选择使用句柄系统中间件组件。
1.1 全球Handle服务器(GHR)GHR是单一根服务器,注册每个本地节点(LHR)并通过使用命名权限句柄提供其服务信息。
句柄系统下的每个命名权限都必须在GHR下注册为命名權限句柄,命名权限句柄提供管理命名权限下所有句柄的句柄服务的服务器信息。
1.2 本地服务器(LHS)本地服务(LHS)在给定的命名权限集下管理句柄。
每个命名权限定义一个“本地”名称空间,该名称空间由命名权限下的所有句柄组成。
system_handle_information 结构详解在计算机科学中,系统处理信息是操作系统、硬件驱动程序以及应用程序的重要功能。
系统处理信息主要涉及到数据的读写、存储、转换和传送。
为了理解这些信息处理的细节,我们需要对一些关键的数据结构有深入的了解,其中之一就是system_handle_information结构。
一、概述system_handle_information结构是操作系统中用于管理系统资源(如文件、设备、内存等)的重要数据结构。
它提供了有关系统资源分配、使用和回收的信息。
这个结构通常包含有关资源类型的标识符、资源句柄、状态信息以及相关的操作函数等。
二、结构定义system_handle_information结构通常在代码中以特定的方式定义。
其定义可能因操作系统和编程语言而异,但通常会包含以下字段:*handle:资源句柄,用于标识特定的系统资源。
句柄是一种抽象的概念,可以代表各种不同类型的资源,如文件、设备、网络连接等。
*type:资源类型标识符,用于表示资源的种类,如文件、设备驱动程序、内存管理等。
*status:资源状态信息,用于表示资源的当前状态,如使用中、空闲、已关闭等。
*operations:操作函数指针数组,用于执行与资源相关的各种操作,如打开、关闭、读取、写入等。
三、使用场景system_handle_information结构在操作系统中起着至关重要的作用,它涉及到系统资源的管理和操作。
以下是一些常见的使用场景:*资源分配:在操作系统启动时,系统会根据需求分配资源,如内存、文件、设备等。
分配的资源通常通过句柄进行标识,以便于后续的操作和管理。
*资源使用:应用程序通过调用操作系统提供的API来使用分配的资源。
这些API通常会传递句柄作为参数,以便操作系统能够识别和操作相应的资源。
*资源回收:当资源不再需要时,操作系统会回收它们以供其他进程使用。
回收的过程通常涉及到关闭句柄、释放资源以及更新相关数据结构。
七七七七七七七七七七七七七七七七七七七七七七七七七七七七七七七七七七七七七七七七七七七七专题:工业互联网标识1引言工业互联网标识解析体系是我国工业互联网建设的重要任务,我国工业互联网发展纲领性文件《关于深化“互联网+先进制造业”发展工业互联网的指导意见》指出,工业互联网的核心是基于全面互联而形成数据驱动的智能,标识解析体系作为工业互联网的关键神经系统,是实现工业系统互联和工业数据传输交换的支撑基础。
通过工业互联网标识解析系统,构建人、机、物全面互联的基础设施,可以实现工业设计、研发、生产、销售、服务等产业要素的全面互联,提升协作效率,对促进工业数据的开放流动与聚合、推动工业资源的优化集成与自由调度、支撑工业集成创新应用具有重要意义。
2标识解析体系现状工业互联网标识解析体系主要由标识编码和标识解析两部分构成,标识编码指为人、机、物等实体对象和算法、工艺等虚拟对象赋予全球唯一的身份标识,类似于互联网中的名字服务;标识解析指通过标识编码查询标识对象在网络中的服务站点,类似于互联网中的域名解析服务。
工业互联网标识解析系统类似于域名解析系统,是实现资源互联互通的关键基础设施,主流的标识解析体系主要有Handle 、GS1和OID 等,目前多用于流通环节的供应链管理、产品溯源等场景中。
随着工业互联网的深入推进,采用公有标识对各类资源进行标准化编码成为实现信息共享,推进工业智能化的基础。
Handle 系统是一套由国际DONA 基金会组织运行和管理的全球分布式管理系统。
Handle 系统是数字对象架构(Digital Object Architecture ,DOA )的主要实现形式,采用分段管理和解析机制,实现对象的注册、解析与管理。
Handle 系统采用两段式命名机制,结构为权威域(NamingAuthority )/本地域(Local Name ),权威域和本地命名之间用“/”分隔,权威域下可管辖若干子权威域,自左向右用“.”隔开。
Handle源码分析,深⼊群内了解风骚的Handle机制Hanlder的使⽤⽅式⼀:1private static Handler mHandler = new Handler(){2public void handleMessage(android.os.Message msg) {3switch (msg.what) {4case ONE:56break;78default:9break;10 }11 };12 };Handler的使⽤⽅式⼆:1public void startHandlerThread(){2 HandlerThread mHandlerThread = new HandlerThread("TestHandler");3 mHandlerThread.start();4 Handler mHandler = new Handler(mHandlerThread.getLooper()){5 @Override6public void handleMessage(Message msg) {7// TODO Auto-generated method stub8super.handleMessage(msg);9 }10 };11 }第⼆种⽐较通⽤,为什么这么说类,原因就是HandlerTrehad是个Thread,在run⽅法内部已经完成了Looper.prepare()的⽅法的调⽤,所以即使在⼦线程中也不会有任何问题基本的使⽤就暂时说这些进⼊咱们今天的正题,深⼊裙内分析Handler源码:1/**2 * Sends a Message containing only the what value.3 *4 * @return Returns true if the message was successfully placed in to the5 * message queue. Returns false on failure, usually because the6 * looper processing the message queue is exiting.7*/8public final boolean sendEmptyMessage(int what)9 {10return sendEmptyMessageDelayed(what, 0);11 }关于sendMessage就暂时拿这个进⼊问题内部;Line10:说的很明确,调⽤delay⽅法,传⼊delay事件零毫秒,在跟进⼀步1/**2 * Sends a Message containing only the what value, to be delivered3 * after the specified amount of time elapses.4 * @see #sendMessageDelayed(android.os.Message, long)5 *6 * @return Returns true if the message was successfully placed in to the7 * message queue. Returns false on failure, usually because the8 * looper processing the message queue is exiting.9*/10public final boolean sendEmptyMessageDelayed(int what, long delayMillis) {11 Message msg = Message.obtain();12 msg.what = what;13return sendMessageDelayed(msg, delayMillis);14 } 这个⽅法为每个Handler消息进⾏封装⼀个Message对象,然后继续调⽤delay⽅法,但是这个⽅法的参数和之前的不⼀样,不通点就是接受⼀个Mesage对象,和⼀个延迟的时间。
C++Handle(句柄)part1本⽂是我学习C++沉思录第6章的笔记本⽂主要讲述了Handle类的概念,定义⽅法以及写时复制技术。
在前⽂(Surrogate代理类)的讲解中我们了解到了代理的实现⽅法.代理类有很多好处,但是⿇烦的是每次都得进⾏复制.如果该类是经常使⽤并且member很多的话,这样复制的消耗是⼗分客观的.因此这⾥就要介绍另外⼀种代理类,Handle,也就是句柄类.为何使⽤句柄类?⾸先就是复制问题.前⾯有谈到,有些类内部数据很多,采⽤复制消耗⾮常⼤,这种情况下就必须采⽤句柄类来进⾏操作.其次是由于函数的参数和返回值都是采⽤了复制进⾏⾃动传递.虽然c++中引⽤可以避免,但是很多情况下返回值采⽤引⽤并不明智.对于采⽤指针的⽅式,可以解决问题,但是⼜会引⼊调⽤者对于动态管理内存的⿇烦.⽽这往往是很多错误的根源.何为句柄类呢?句柄类可以理解为采⽤了引⽤计数的代理类.其多个句柄共享了同⼀个被代理的类.通过引⽤计数的⽅式来减少复制以及内存管理.其⾏为类似指针,因此也有智能指针之称,但其实差别很⼤.后⾯会有讲述.句柄类例⼦:先有⼀个简单的类Point1class Point2 {/*{{{*/3public:4 Point():_x(0),_y(0){}5 Point(int x,int y):_x(x),_y(y){}6int x()const {return _x;}7void x(int xv) { _x = xv;}8int y()const { return _y;}9void y(int yv) { _y = yv;}10private:11int _x;12int _y;13 };/*}}}*/接下来我们要定义其的Handle类.我们的Handle类:1class Handle2 {3public:4 Handle():up(new UPoint){}5 Handle(int x,int y):up(new UPoint(x,y)){}6 Handle(const Point&p):up(new UPoint(p)){}7 Handle(const Handle &h);8 ~Handle();9 Handle& operator=(const Handle &h);10int x() const{ return up->p.x(); }11int y() const{ return up->p.y(); }12 Handle& x(int);13 Handle& y(int);141516private:17 UPoint *up;18void allocup();19 };这⾥说明我们的Handle和指针的不同之处.也许有读者会对Handle有疑问,为什么不采⽤operator->来直接操作point呢?其实顾虑就是operator->返回的是point的地址.也就是使⽤者可以轻易的获得point的地址进⾏操作,这并不是我们想要的.这也就是Handle也pointer不想同的地⽅.UPoint是为了采⽤引⽤计数定义的数据结构1//all member is private..only assess by Handle2class UPoint3 {/*{{{*/4 friend class Handle;56 Point p;7int u;//count89 UPoint():u(0){}10 UPoint(const Point&pv):p(pv){}11 UPoint(int x,int y):p(x,y),u(1){}12 UPoint(const UPoint &up):p(up.p),u(1){}13 };/*}}}*/对于Handle类的操作,我们要在Handle类进⾏复制的时候,累加Handle指向的UPoint的计数值即复制构造函数以及赋值函数1 Handle::Handle(const Handle &h)2 :up(h.up)3 {4 ++up->u;5 }67 Handle& Handle::operator=(const Handle &h)8 {9 ++h.up->u;10if (--up->u == 0)11 delete up;12 up = h.up;13return *this;14 }⽽对于析构函数,则是减⼩引⽤计数,如果减到0了,就说明没有其他的Handle指向了UPoint,因此我们要删除掉.1 Handle::~Handle()2 {3if (--up->u == 0)4 delete up;5 }剩下的就是定义Handle对于Point的操作了.即Handle::x(int xv)和Handle::(int yv)了.这⾥有2种写法.⼀种是像指针⼀样,对于赋值,就直接修改指向的Point⾥⾯的值.这种⽅法有⼀个问题,即所以都指向这个Point的Handle类获取的x值都会变化.代码:1//point like2 Handle& Handle::x(int xv)3 {4 up->p.x(xv);5return *this;6 }7//point like8 Handle& Handle::y(int yv)9 {10 up->p.y(yv);11return *this;12 }还有⼀种是写时复制技术,即每次对于共享的Point进⾏修改的时候都复制⼀份新的Point,然后进⾏修改.这种技术在Handle中⼤量采⽤.在stl中,string也采⽤了同样的⽅法.其额外开销很⼩,⽽效率也不差.代码:1void Handle::allocup()2 {3if (up->u != 1)4 {5 --up->u;6 up = new UPoint(up->p);7 }8 }910 Handle& Handle::x(int xv)11 {12 allocup();13 up->p.x(xv);14return *this;15 }1617 Handle& Handle::y(int yv)18 {19 allocup();20 up->p.y(yv);21return *this;22 }⾄此,Handle类的第⼀部分就讲完了.之后会有第⼆部分的讲解.解决了多出了⼀个UPoint的⿇烦.。