类型安全的通用模板类.ppt

上传人:牧羊曲112 文档编号:6329516 上传时间:2023-10-17 格式:PPT 页数:25 大小:234.32KB
返回 下载 相关 举报
类型安全的通用模板类.ppt_第1页
第1页 / 共25页
类型安全的通用模板类.ppt_第2页
第2页 / 共25页
类型安全的通用模板类.ppt_第3页
第3页 / 共25页
类型安全的通用模板类.ppt_第4页
第4页 / 共25页
类型安全的通用模板类.ppt_第5页
第5页 / 共25页
点击查看更多>>
资源描述

《类型安全的通用模板类.ppt》由会员分享,可在线阅读,更多相关《类型安全的通用模板类.ppt(25页珍藏版)》请在三一办公上搜索。

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 单链表类:slist_base,class slis

2、t_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 main()slist_base slb;slb.insert(new expr);slb.ins

3、ert(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)slist_base:insert(a);T*get()return(T*)slist_base:get();/,2.使用类模板,voi

5、d 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来完成,而类模板只是为了防止出现不安全的类型。直观地说,类模板ilist好像是一个过滤器,不安全的类型传给它时都会被检查出来,12.8 容器和迭代器,12.8.1 容器简述,12.8.2 通过模板构造容器

6、,说明如何通过模板获得类型安全性检查(参见12.7),12.8.3 迭代器,迭代器:是一个对象,它在其他对象的容器上遍历,每次选择他们 中的一个,不需要提供对这个容器的实现的直接访问。提供了一种访问元素的标准方法;通常与容器联合使用;在许多情况下,是一个“灵巧指针”;但比通常的指针运算更安全。,例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,类的完整定义:,参见吕书 P240,12.8.4 为什么使用迭代器,例1:增加了简单迭代器的intstack,P718 C16:IterIntStack.cpp 迭代器的关键:从一个容器元素移动到下一个元素的复杂过程被抽象成就 像一个指针一样。,例2:更一般化:嵌套的iterator,P721:,例3:容器+迭代器IterStackTemplate.h,P724 C16:IterStackTemplate.h,12.5.5 所有权问题(略),(课后阅读),

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号