[精选]类型安全的通用模板类

上传人:我**** 文档编号:176652829 上传时间:2021-03-26 格式:PPTX 页数:29 大小:244.18KB
返回 下载 相关 举报
[精选]类型安全的通用模板类_第1页
第1页 / 共29页
[精选]类型安全的通用模板类_第2页
第2页 / 共29页
[精选]类型安全的通用模板类_第3页
第3页 / 共29页
[精选]类型安全的通用模板类_第4页
第4页 / 共29页
[精选]类型安全的通用模板类_第5页
第5页 / 共29页
点击查看更多>>
资源描述

《[精选]类型安全的通用模板类》由会员分享,可在线阅读,更多相关《[精选]类型安全的通用模板类(29页珍藏版)》请在金锄头文库上搜索。

1、12.7 类型安全的通用模板类,12.7.1 单链表类,单向链表结点= 数据结点 + 链指针结点,可以是不同的类型,总是相似的: 指向一个链表结点的指针,公共特征,作为基类,1 链结点:slink,struct slink slink * next; slink() next = 0 ; slink(slink *p) next = p;,2 表结点: name,include class name:public slink char * s; public: name (const char *ss) s=new charstrlen(ss)+1; strcpy(s,ss); /,3 单链表

2、类:slist_base,class slist_base / . public: int insert(slink *); / upcasting,可以处理不同类型的结点 int append(slink *); / upcasting slink *get();,4 使用单链表,void f(const char *s) slist_base slb; slb.insert(new name(s); / name *p=(name *)slb.get(); / delete p;,12.7.2 扩充:链表结点expr,class expr: public slink / ; void ma

3、in() slist_base slb; slb.insert(new expr); slb.insert(new name(“s1”); slb.insert(new expr); / expr *e1=(expr *)(slb.get(); expr *e2=(expr *)(slb.get(); / 使用e2可能出错,12.7.3 有什么问题,由于slist_base是按slink而不是name 来定义对链表的操作,当对象放入链表之后,其静态类型信息也就消失了。当从链表中取出它时,需要进行强制类型转换,把链表中存放的对象转换成它原来的类型name.但是:要记住每次取出对象的具体类型是很困

4、难的。 难题:如何保证链表中的类型安全性? 若用虚函数,不必进行强制类型转换,没有什么问题。但用户只能通过虚函数的动态绑定来使用基类提供的接口; 若要对具体的派生类进行处理,则注定了这种异质链表(链表中可以存放不同类型的对象)不是类型安全的,12.7.4 同质链表的类型安全性,同质链表:链表中只能存放相同类型的对象。 同样地,如何保证其类型安全性,即如何避免链表中插入对象与取出对象类型不一致的问题。 利用模板参数在编译时的类型检查,1. 类模板Islist,template class Islist: private slist_base public: void insert(T *a) s

5、list_base:insert(a); T *get() return(T *)slist_base:get(); /,2. 使用类模板,void f(const char *s) Islist ilst; ilst.insert(new name(s); / name *p = ilst.get(); / delete p;,3. 误用类模板,void f2(const char *s) Islist ilist; ilist.insert(new expr); / 编译时error,类型不匹配 /,小结,在Islist实现中,实际的工作仍然由slist_base来完成,而类模板只是为了防

6、止出现不安全的类型。 直观地说,类模板ilist好像是一个过滤器,不安全的类型传给它时都会被检查出来,12.8 容器和迭代器,12.8.1 容器简述,什么是容器? 容器就是用来装对象的东西,容器本身也是一个对象。如:数组,链表,栈,队列,集合等。 他们之所以被称为“容器”就是因为他们的存在在很大程序上就是为了容纳一组别的东西,例: vector,12.8.2 通过模板构造容器,说明如何通过模板获得类型安全性检查 (参见12.7,12.8.3 迭代器,迭代器: 用于访问容器的东西的抽象概念,比如用于遍历链表结点的指针,用于访问数组元素的下标等等。 迭代器是一个对象,它在(其他对象的)容器上遍历,

7、每次选择容器中的一个元素,但不需要提供对这个容器的实现的直接访问。 提供了一种访问元素的标准方法; 通常与容器联合使用; 在许多情况下,是一个“灵巧指针”;但比通常的指针运算更安全,例1:访问链表的迭代器类,class slist_base_iter slink *ce ; /当前元素 slist_base *cs; /当前链表 public: slisk_base_iter(slist_base,例1:类型安全的迭代器类模板,template class Islist_iter:private slist_base_iter public: Islist_iter(Islist,类的完整定义

8、,参见吕书 P240,12.8.4 为什么使用迭代器,可以提供比下标更复杂的操作方法 隐藏了实现细节,比指针更易用,例1:增加了简单迭代器的intstack,P718 C16:IterIntStack.cpp 迭代器的关键: 从一个容器元素移动到下一个元素的复杂过程被抽象成就 像一个指针一样,例2:更一般化:嵌套的iterator,P721,例3:容器+迭代器IterStackTemplate.h,P724 C16:IterStackTemplate.h,12.5.6 C+标准模板库,STL (Standard Template Library) :标准模板库 STL是一些“容器”的集合,这些

9、“容器”有list,vector,set,map等,STL也是算法和其他一些组件的集合。这里的“容器”和算法的集合指的是世界上很多聪明人很多年的杰作。 STL容器可以保存对象,内建对象和类对象。它们会安全地保存对象,并定义我们能够操作的这个对象的接口。 STL算法是标准算法,我们可以把它们应用在那些容器中的对象上。这些算法都有很著名的执行特性。它们可以给对象排序,删除它们,给它们记数,比较,找出特殊的对象,把它们合并到另一个容器中,以及执行其他有用的操作,12.5.6 C+标准模板库(续,STL iterator就象是容器中指向对象的指针。STL的算法使用iterator在容器上进行操作。Iterator设置算法的边界 ,容器的长度,和其他一些事情。举个例子,有些iterator仅让算法读元素,有一些让算法写元素,有一些则两者都行。 Iterator也决定在容器中处理的方向。 begin()和 end( ) 你可以通过调用容器的成员函数begin()来得到一个指向一个容器起始位置的iterator。你可以调用一个容器的 end() 函数来得到过去的最后一个值(就是处理停在那的那个值,例4:vector 和 iterator,12.5.6 所有权问题(略,课后阅读,演讲完毕,谢谢观看

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > PPT模板库 > 其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号