类模板(十七)

一、类模板简介

     对于一个类中的参数类型变化的情况,需要定义类模板,比如通过类模板定义不同的数据结构,也被称为容器,即STL。对于类模板定义需要注意三个方面:一是在类前添加template<typename Type>以声明该类为一个类模板;二是在类模板中定义的函数都是模板函数,如果是在类内部进行定义可以直接定义,如果在类外定义需要以模板函数的形式进行定义,如template<typename Type>  List<Type>::push_back(Type d){......},需要注意的这里的类作用域需要写全,因为使用的是类模板,所以需要加上<Type>,即类模板不是类,它的准确定义就是List<Type>;三是在很多情况下类模板需要调用其他类中的私有成员,如调用ListNode<Type>中的data等,这是需要通过友元即friend方式进行声明,首先需要声明类存在,即template<typename Type>  class List<Type>;接着要在类中声明友元,如果一个类需要调用另一个类中的私有成员则需要在该类中将自己定义为友元。即friend class List<Type>。

二、实例介绍

     对于类模板用处最多的就是容器类,这里以单链表介绍实例如下:

#include <iostream>
#include <stdlib.h>

template<typename Type>
class List;

template<typename Type>
class ListNode{
public:
  friend class List<Type>;
public:
  ListNode():data(Type()){}
  ListNode(Type d, ListNode<Type> *n):data(d),next(n){}
  ~ListNode(){}
private:
  Type data;
  ListNode<Type> *next;
};

template<typename Type>
class List{
public:
  List();
  bool push_back(Type d);
  void show_list()const;
private:
  ListNode<Type> *first;
  ListNode<Type> *last;
  size_t size;
};

template<typename Type>
List<Type>::List(){
  first = last = (ListNode<Type> *)malloc(sizeof(ListNode<Type>));
  first->next = last;
  last->next = NULL;
  size = 0;
  //char * str = (char *)malloc(sizeof(char)*10);
}

template<typename Type>
bool List<Type>::push_back(Type d){
  ListNode<Type> *node = (ListNode<Type> *)malloc(sizeof(ListNode<Type>));
  if(node == NULL){
    return false;
  }
  node->data = d;
  node->next = NULL;
 
  last->next = node;
  last = node;
  return true;
}

template<typename Type>
void List<Type>::show_list()const{
  ListNode<Type> *p = first;
  while(p!=NULL){
    std::cout<<p->data<<"->";
    p=p->next;
  }
  std::cout<<"end"<<std::endl;
}


#include "class_template.h"

int main(int argc, char **argv){
  List<int> mylist;
  for(int i=0; i<=10; ++i){
    mylist.push_back(i);
  }
  mylist.show_list();
 
  List<char> charlist;
  for(int j=66; j<75; ++j){
    charlist.push_back(j);
  }
  charlist.show_list();
}


三、注意事项

      对于类模板有些编译器不支持头文件和源文件分开编译,如VC6.0,有些编译器支持,所以在编译时需要针对不同情况进行设计,如果不支持,就将所有的内容放在头文件中即可。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值