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

  • 0
  • 0
  • 约3.25千字
  • 约 29页
  • 2022-05-27 发布于重庆
  • 举报
12.7 类型安全的通用模板类 第一页,共二十九页。 12.7.1 单链表类 单向链表结点= 数据结点 + 链指针结点 可以是不同的类型 总是相似的: 指向一个链表结点的指针 (公共特征,作为基类) 第二页,共二十九页。 1 链结点:slink struct slink{ slink * next; slink(){ next = 0 ;} slink(slink *p) {next = p;} } 第三页,共二十九页。 2 表结点: name #include string.h class name:public slink{ char * s; public: name (const char *ss) { s=new char[strlen(ss)+1]; strcpy(s,ss); } // … } 第四页,共二十九页。 3 单链表类: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 main() { 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.但是:要记住每次取出对象的具体类型是很困难的。 难题:如何保证链表中的类型安全性? 若用虚函数,不必进行强制类型转换,没有什么问题。但用户只能通过虚函数的动态绑定来使用基类提供的接口; 若要对具体的派生类进行处理,则注定了这种异质链表(链表中可以存放不同类型的对象)不是类型安全的。 第八页,共二十九页。 12.7.4 同质链表的类型安全性 同质链表:链表中只能存放相同类型的对象。 同样地,如何保证其类型安全性,即如何避免链表中插入对象与取出对象类型不一致的问题。 利用模板参数在编译时的类型检查! 第九页,共二十九页。 1. 类模板Islist template class T class Islist: private slist_base { public: void insert(T *a) { slist_base::insert(a); } T *get() { return(T *)slist_base::get(); } // … } 第十页,共二十九页。 2. 使用类模板 void f(const char *s) { Islistname ilst; ilst.insert(new name(s)); // … name *p = ilst.get(); // … delete p; } 第十一页

文档评论(0)

1亿VIP精品文档

相关文档