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),或组合成其它模式,因为外部类已经组合到嵌

套类。通常使用嵌套类都不会局限于完成一些同步进行的操作,往往都去参与异步的回调。
过多的异步和回调,往往意味着逻辑(代码)的支离破碎,让人难以理解。

时间: 2024-10-03 22:25:29

ZeroC ICE源代码中的那些事 - 嵌套类和局部类的相关文章

C++ 中的嵌套类和局部类

C++ 中的嵌套类和局部类 最近趁着春节假期空闲,找了本C++ Primer 学了几章,发现C++ 中的许多特性自己都不知道.其中嵌套类和局部类感觉还是蛮有用的,简单的写写他们的用法. 嵌套类 所谓嵌套类就是可以在一个类中定义另一个类.这个被嵌套的类的作用域就只在它的上一级类中.下面是个例子: #include <iostream> using namespace std; class c1 { public: int a; void foo(); class c2 { public: int

嵌套类和局部类

嵌套类和局部类在工作中极少使用,且均可在设计上替代,这里仅做简要介绍.1)局部类局部类就是将类定义在函数中.形如:int val = 100;void foo(int val){ struct Bar { }; class Bar::InsideClass//定义InsideClass类 { }; }2)嵌套类嵌套类就是将一个类定义在另一个类中.形如:class Interface{public:? ?virtual void Fun() = 0; ?};?template <class T,

C# 静态static 嵌套类 分部类

/*static的相关内容:静态字段,静态属性,静态方法,,静态构造,静态类,readonly,const,嵌套类,分部类 * static可以理解为全局的,共享同一块内存 * 可以通过default(类型名)得到每个类型的默认值 * 静态字段不从属于字段而是从属与类,而实例字段都是从属于每个字段,针对于每个字段都有不同的值 * 类和对象都能关联数据: * this是用于实例的访问方法,所以你能用this.静态成员进行访问 * 要想在静态方法中获得实例成员的访问,就必须先获得对字段或方法所从属于

嵌套类 局部类

嵌套类 局部类 <c++ primer 3th> C++嵌套类 1.   嵌套类的名字只在外围类可见. 2.   类的私有成员只有类的成员和友元可以访问,因此外围类不可以访问嵌套类的私有成员.嵌套类可以访问外围类的成员(通过对象.指针或者引用). 3.   一个好的嵌套类设计:嵌套类应该设成私有.嵌套类的成员和方法可以设为 public . 4.   嵌套类可以直接访问外围类的静态成员.类型名( typedef ).枚举值. 嵌套类 一个类可以在另一个类中定义,这样的类被称为嵌套类.嵌套类是其

C++ Primer 学习笔记_104_特殊工具与技术 --嵌套类

特殊工具与技术 --嵌套类 可以在另一个类内部(与后面所讲述的局部类不同,嵌套类是在类内部)定义一个类,这样的类是嵌套类,也称为嵌套类型.嵌套类最常用于定义执行类. 嵌套类是独立的类,基本上与它们的外围类不相关,因此,外围类和嵌套类的对象是互相独立的.嵌套类型的对象不具备外围类所定义的成员,同样,外围类的成员也不具备嵌套类所定义的成员. 嵌套类的名字在其外围类的作用域中可见,但在其他类作用域或定义外围类的作用域中不可见.嵌套类的名字将不会与另一作用域中声明的名字冲突 嵌套类可以具有与非嵌套类相同

C++ 嵌套类使用(一)

一.嵌套类 在一个类的内部定义另一个类,我们称之为嵌套类(nested class),或者嵌套类型.之所以引入这样一个嵌套类,往往是因为外围类需要使用嵌套类对象作为底层实现,并且该嵌套类只用于外围类的实现,且同时可以对用户隐藏该底层实现.     虽然嵌套类在外围类内部定义,但它是一个独立的类,基本上与外围类不相关.它的成员不属于外围类,同样,外围类的成员也不属于该嵌套类.嵌套类的出现只是告诉外围类有一个这样的类型成员供外围类使用.并且,外围类对嵌套类成员的访问没有任何特权,嵌套类对外围类成员的

C++学习笔记(十二):类继承、虚函数、纯虚函数、抽象类和嵌套类

类继承 在C++类继承中,一个派生类可以从一个基类派生,也可以从多个基类派生. 从一个基类派生的继承称为单继承:从多个基类派生的继承称为多继承. 1 //单继承的定义 2 class B:public A 3 { 4 < 派生类新定义成员> 5 }; 6 //多继承的定义 7 class C:public A,private B 8 { 9 < 派生类新定义成员> 10 }; 我们这篇主要说单继承. 派生类共有三种C++类继承方式: 公有继承(public) 基类的公有成员和保护成

java嵌套类(Nested&amp;nbsp;Classes)总结

转自:http://www.cnblogs.com/aigongsi/archive/2012/04/24/2467183.html Nested Classes定义 在java语言规范里面,嵌套类(Nested Classes)定义是: A nested class is any class whose declaration occurs within the body of another class or interface. A top level class is a class t

你所不知道的html5与html中的那些事(二)

文章简介: 关于html5相信大家早已经耳熟能详,但是他真正的意义在具体的开发中会有什么作用呢?相对于html,他又有怎样的新的定义与新理念在里面呢?为什么一些专家认为html5完全完成后,所有的工作都可以达到真正的云方式呢?这一系列的问题你是否已经想明白了呢? 本系列文章将为您一一解答你所不知道的关于html5与html中的那些事;具体会包括如:html5新的理念与想法,html5的新标签的用意与具体开发中场景应用,html5与css3的感情经历(用法搭配),包括html5的父亲html的一些