类模板(十七)

来源:互联网 发布:ubuntu xampp panel 编辑:程序博客网 时间:2024/06/05 04:54

一、类模板简介

     对于一个类中的参数类型变化的情况,需要定义类模板,比如通过类模板定义不同的数据结构,也被称为容器,即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,有些编译器支持,所以在编译时需要针对不同情况进行设计,如果不支持,就将所有的内容放在头文件中即可。