ZeroC ICE源代码中的那些事 - 嵌套类和局部类
使用嵌套类(类中定义的类,c++没有静态类)或局部类(在函数或成员方法中定义的类),进行行为模式的委托(委托请求)或异步
。
java中嵌套类和局部类隐式完成了你对外部对象(实例)访问的私有堆栈的初始化,而c++你必须通过类成员变量来保存你要访问到的
外部对象(变量,实例),即自行实现私有堆栈,并使用嵌套类和局部类的构造函数,以参数传递的方式初始化这些用作私有堆栈的成
员变量。当你的局部类(在函数中定义的类)要访问到函数的局部变量时,你并不能确保局部类在局部变量被释放前访问,所以你只能
将局部变量进行拷贝复制到你的局部类的私有堆栈(c++中由你自行用成员变量实现),并且复制成const变量,表明你不会去对这些变
量进行修改,因为即使你进行修改也不是真的对局部类外部的堆栈局部变量进行修改,你只是对一分私有副本进行访问修改。在java中
由语法检查器为我们检查是否在访问一个Final变量。在java中你可以很自然地使用嵌套类或局部类进行行为模式的委托,因为嵌套类
或局部类可以直接访问到将它们(new)实例化的(某对象的成员)方法的上下文this引用。而在c++中你必须还要使用成员变量保存这
个外部上下文中的this,还要在构造函数中对其进行初始化。当然还要将你的声明为私有的嵌套类声明为外部类的友元,从而获得对外
部类的全部访问权限。
java相比于c++,还有一种特殊的局部类,就是匿名局部类,可以在new的同时override对象的方法。
不难想象,其实ObjectC的执行块(Block,以^开头定义的执行块),其实质也是一个匿名的局部类,编译器自动为你完成这个匿名的
局部类访问到外部变量的私有堆栈。事实上Block就是一个类。请参看《objc反汇编分析,block函数块为何物?》。
同样c++11中也有等价物,就是lambda。你必须在lambda声明中的[]内设计你的私有堆栈,官方名称是capture list,不同于其它语言
的是你可以指定私有堆栈上变量的副本类型,是copy还是引用。
c++使用嵌套类或局部类进行委托是十分不方便的,因为c++中的实例的生命期并不被管理,必须由程序员自己管理。即使有了
shared_ptr等指针管理器的帮助,还是不能随意地就可以使用嵌套类或局部类进行委托。因为有时候委托中还必须依赖其它对象的协作
,而这些对象可能来自其它库或子系统,并没有一套统一的对象生命期管理,你还是不得不在你的委托中加入这些生命期管理和代码,
这些委托同时可能需要进行异步。在Ice编程环境中,统一使用了生命期管理,所以Ice内核代码中就有不少地方使用了嵌套类或局部类
进行委托以及异步,这样的编程在Java项目中十分常见的,但在c++项目中就比较罕见,一般只使用嵌套类或局部类定义一些结构体。
常见的使用局部类进行异步的有,Java的Runnable,ObjectC的dispatch_async,通常都会将函数一部分逻辑异步到其它地方;或者将
一部分逻辑嵌入到其它回调框架中,Java的匿名局部类Override回调类,ObjectC使用Block块,而这些回调都意味着函数的一部分逻辑
异步到别的地方去。这样的方便就是,我们不用通过对我们的知名类进行接口继承,写另外一些成员函数的实现。
我们现在开始,提及的嵌套类(c++中我们包含了对外部类实例的引用,并声明为外部类的友元)。我们使用嵌套类进行委托,也同时
可以减少对框架接口的继承,我们可以通过嵌套类完成模式上的事情,将扩展的功能委托给嵌套类。例如我们的类要在别的框架内运行
,我们必须实现其中的一些回调接口。我们的类每参与到一个框架中,都必须去继承一个或多个接口,这时我们可以通过嵌套类来为我
们完成这些继承,我们将一切委托给嵌套类。嵌套类成了外部类的一个代理(proxy),或组合成其它模式,因为外部类已经组合到嵌
套类。通常使用嵌套类都不会局限于完成一些同步进行的操作,往往都去参与异步的回调。
过多的异步和回调,往往意味着逻辑(代码)的支离破碎,让人难以理解。
ZeroC ICE源代码中的那些事 - 嵌套类和局部类的更多相关文章
- C++学习之嵌套类和局部类
C++学习之嵌套类和局部类 局部类 在一个函数体内定义的类称为局部类. 局部类中只能使用它的外围作用域中的对象和函数进行联系,因为外围作用域中的变量与该局部类的对象无关.在定义局部类时需要注意:局部类 ...
- C++ Primer 笔记——嵌套类 局部类
1.嵌套类是一个独立的类,与外层类基本没什么关系.特别的是,外层类的对象和嵌套类的对象是相互独立的.在嵌套类的对象中不包含任何外层类定义的成员,在外层类的对象中也不包含任何嵌套类定义的成员. 2.嵌套 ...
- python中的嵌套类
python中的嵌套类 在.NET和JAVA语言中看到过嵌套类的实现,作为外部类一个局部工具还是很有用的,今天在python也看到了很不错支持一下.动态语言中很好的嵌套类的实现,应该说嵌套类解决设计问 ...
- kotlin中的嵌套类与内部类
Java中的内部类和静态内部类在Java中内部类简言之就是在一个类的内部定义的另一个类.当然在如果这个内部类被static修饰符修饰,那就是一个静态内部类.关于内部类 和静态内部类除了修饰符的区别之外 ...
- 【转】C#类的分类(静态类、实例类、嵌套类、结构、简单的抽象类、简单的密封类)
静态类 -------------------------------------------------------------------------------- 静态类就是在class关键字前 ...
- C++ 嵌套类使用(一)
一.嵌套类 在一个类的内部定义另一个类,我们称之为嵌套类(nested class),或者嵌套类型.之所以引入这样一个嵌套类,往往是因为外围类需要使用嵌套类对象作为底层实现,并且该嵌套类只用于外围类的 ...
- C++学习笔记(十二):类继承、虚函数、纯虚函数、抽象类和嵌套类
类继承 在C++类继承中,一个派生类可以从一个基类派生,也可以从多个基类派生. 从一个基类派生的继承称为单继承:从多个基类派生的继承称为多继承. //单继承的定义 class B:public A { ...
- 嵌套类,PIMPL
body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...
- C++ Primer 学习笔记_104_特殊工具与技术 --嵌套类
特殊工具与技术 --嵌套类 能够在还有一个类内部(与后面所讲述的局部类不同,嵌套类是在类内部)定义一个类,这种类是嵌套类,也称为嵌套类型.嵌套类最经常使用于定义运行类. 嵌套类是独立的类,基本上与它们 ...
随机推荐
- python-url中中文编码与解码
接口测试中遇到这种情况:get请求的传参有中文,以致url中有中文编码. 下面是常见的一种编码解码方式: from urllib.request import quote, unquote url = ...
- Opentracing + Uber Jaeger 全链路灰度调用链,Nepxion Discovery
当网关和服务在实施全链路分布式灰度发布和路由时候,我们需要一款追踪系统来监控网关和服务走的是哪个灰度组,哪个灰度版本,哪个灰度区域,甚至监控从Http Header头部全程传递的灰度规则和路由策略.这 ...
- 互联网基础协议 - HTTP
HTTP的简介 超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议.所有的WWW文件都必须遵守这个标准. HTTP是一个基于TCP/ ...
- uni-app 请求封装
1.创建一个http.js const baseUrl = 'http://192.168.1.188:8080'; const httpRequest = (opts, data) => ...
- Xbim.GLTF源码解析(一):简介
原创作者:flowell,转载请标明出处:https://www.cnblogs.com/flowell/p/10838972.html 简介 Xbim.GLTF是将IFC文件转换成GLTF文件的一个 ...
- 第三十八章 POSIX线程(二)
线程属性 初始化与销毁属性 int pthread_attr_init(pthread_attr_t *attr); int pthread_attr_destroy(pthread_attr_t * ...
- win10+MinGw+ffmpeg 编译
一.安装MinGw+msys 下载 mingw-get-setup.exe 并安装,安装完成会弹出以下界面. 选中红色框几个选项,点击Installation->Apply Changes 进行 ...
- Vue学习笔记(五)——配置开发环境及初建项目
前言 在上一篇中,我们通过初步的认识,简单了解 Vue 生命周期的八个阶段,以及可以应用在之后的开发中,针对不同的阶段的钩子采取不同的操作,更好的实现我们的业务代码,处理更加复杂的业务逻辑. 而在这一 ...
- 推荐一款Diffy:Twitter的开源自动化测试工具
1. Diffy是什么 Diffy是一个开源的自动化测试工具,是一种Diff测试技术.它能够自动检测基于Apache Thrift或者基于HTTP的服务.通过同时运行新/老代码,对比运行结果,发现潜在 ...
- LeetCode刷题总结-数组篇(下)
本期讲O(n)类型问题,共14题.3道简单题,9道中等题,2道困难题.数组篇共归纳总结了50题,本篇是数组篇的最后一篇.其他三个篇章可参考: LeetCode刷题总结-数组篇(上),子数组问题(共17 ...