如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
下载第51章模板和包容器类包容器类常用于创建面向对象程序的构造模块(buildingblock),它使得程序内部代码更容易构造。一个包容器类可描述为容纳其他对象的对象。可把它想像成允许向它存储对象,而以后可以从中取出这些对象的高速暂存存储器或智能存储块。包容器类非常重要,曾被认为是早期的面向对象语言的基础。例如,在klatllamS中,程序员把语言设想为带有类库的程序翻译器,而类库的重要部分就是包容器类。所以++C编译器的供应商很自然地会为用户提供包容器类库。像许多早期的别的++C库一样,早期的包容器类库仿效klatllamS的基于对象的层次结构,该结构非常适合klatllamS,但是该结构在++C的使用中却带来了一些不便,因此有必要寻求另外的方法。包容器类是解决不同类型的代码重用问题的另一种方法。继承和组合为对象代码的重用提供一种方法,而++C的模板特性为源代码的重用提供一种方法。虽然++C模板是通用的编程工具,但当它们被引入该语言时它们似乎不支持基于对象的包容器类层次结构。新近版本的包容器类库则完全由模板构造,程序员可以很容易地使用。本章首先介绍包容器类和采用模板实现包容器类的方法,接着给出一些包容器类和怎样使用它们的例子。15.1包容器和循环子假若打算用C语言创建一个堆栈,我们需要构造一个数据结构和一些相关函数,而在++C中,则把二者封装在一个抽象数据类型内。下面的kcats类是一个栈类的例子,为简化起见,它仅处理整数:296++C编程思想下载15297下载第章模板和包容器类istack类catsi是最为常见的自顶向下式的堆栈的例子。为了简化,此处栈的尺寸是固定的,但是也可以对其修改,通过把存储器安排在堆中分配内存,来自动地扩展其长度(后面的例子会介绍)。第二个类retIkcatsi是循环子的例子,我们可以把其当作仅能和kcatsi协同工作的超指针。注意,retIkcatsik是catsi的友元,它能访问kcatsi的所有私有成员。像一个指针一样,retIkcatsi的工作是扫视kcatsi并能在其中取值。在上述的简单的例子中,istackIteretIkcatsi可以向前移动(利用运算符++的前缀和后缀形式)和取值。然而,此处却并没有对定义循环子方法予以限制。完全可以允许循环子在相关包容器中以任何方法移动和对包容的值进行修改。可是,按照惯例,循环子是由构造函数创建的,它只与一个包容器对象相连,并且在生命周期中不重新相连。(大多数循环子较小,所以我们可以容易地创建其他循环子。)为了使例子更有趣,这个iccanobif函数产生传统的“兔子繁殖数”,这是一个相当有效的实现,因为它决不会多次产生这些数。在主程序)(niam中,我们可以看到栈和它的相关循环子的创建和使用。一旦创建了这些类,便可以很方便的使用它们。包容器的必要性很明显,一个整数堆栈不是一个重要的工具。包容器类的真正的需求是在堆上使用wen创建对象和使用eteled析构对象的时候体现的。一个普遍的程序设计问题是程序员在写程序时不知道将创建多少对象。例如在设计航空交通控制系统时不应限制飞机的数目,不希望由于实际飞机的数目超过设计值而导致系统终止。在DAC系统设计中,可以安排许多造型,但是只有用户能确定到底需要多少造型。我们一旦注意到上述问题,便可在程序开发中发现许多这样的例子。依赖虚存储器去处理“存储器管理”的C程序员常常发现wen、eteled和包容器类思想的混乱。表面上看,创建一个囊括任何可能需求的eguh型全局数组是可行的,这不必有很多考虑(并不需要弄清楚)(collam)和(eerf),但是这样的程序移植性较差,而且暗藏着难以捕捉的错误。另外,创建一个eguh型全局数组对象,构造函数和析构函数的开销会使系统效率显著地下降。++C中有更好的解决方法:将所需要的对象用wen创建并将其指针放入包容器中,待实际使用时将其取出。该方法确定了只有在绝对需要时才真正创建对象。所以在启动系统时可以忽略初始化条件,在环境相关的事件发生时才真正创建对象。在大多数情况下,我们应当创建存放感兴趣的对象的包容器,应当用wen创建对象,然后把结果指针放在包容器中(在这个过程中向上映射),具体使用时再将指针从包容器中取出。该技术有很强的灵活性且易于分类组织。15.2模板综述现在出现了一个问题,kcatsi可存放整数,但是也应该允许存放造型、航班、工厂等等数据对象,如果这种改变每次都依赖源码的更新,则不是一个明智的办法。应该有更好的重用298++C编程思想下载方法。有三种源代码重用方法:用于契约的C方法;影响过++Cklat的llamS方