c/c++ 类模板初探

类模板

1,模板类里的函数都是模板函数

2,模板类里的函数,在类外面实现的时候,要用模板函数(方法:push_back)的方式实现,在类内部实现时,不需要用模板函数(方法:show)方式实现。

3,用模板类实现单链表,类List是类ListNode的友元类;用友元函数重载了类Value的<<函数;显示链表的show方法在类外面定义的部分注释掉了。

4,在gcc4.8.5-20下,如果把ListNode和List的声明放到.h文件,把实现放在.cpp后,编译无法通过。但是把ListNode和List的声明和实现都放到.h文件,就可以编译通过。完整代码

编译方法:g++ -g template_main.cpp

分割线==============

下面的例子,为了简单起见,都放到了一个cpp文件了。

#include <iostream>
using namespace std;

template<typename A>
class List;

//节点                                                          
template<typename A>
class ListNode{
  friend class List<A>;
public:
  ListNode():data(A()), next(NULL){}
  ListNode(A a, ListNode *n) : data(a), next(n){}
private:
  A data;
  ListNode *next;
};

//单链表                                                        
template<typename A>
class List{
public:
  List();
  //尾插                                                        
  bool push_back(A val);
  //显示链表                                                    
  void show()const{
    ListNode<A> *n = first->next;
    while(NULL != n){
      cout << n->data;
      n = n->next;
    }
    cout << "NULL" << endl;
  }
private:
  ListNode<A> *first;
  ListNode<A> *last;
  size_t size;
};

template<typename T>
List<T>::List(){
  first = last = new ListNode<T>;
  last->next = NULL;
  size = 0;
}
//尾插                                                          
template<typename A>
bool List<A>::push_back(A value){
  ListNode<A> *node = new ListNode<A>;
  if(NULL == node) return false;
  node->data = value;
  node->next = NULL;

  last->next = node;
  last = node;
  size++;

  return true;
}
//显示链表                                                      
/*                                                              
template<typename A>                                            
void List<A>::show()const{                                      
  ListNode<A> *n = first->next;                                 
  while(NULL != n){                                             
    cout << n->data;                                            
    n = n->next;                                                
  }                                                             
  cout << "NULL" << endl;                                       
}                                                               
*/
class Value{
  friend ostream& operator<<(ostream &o, const Value &v);
public:
  Value(int d = 0) : value(d){}
private:
  int value;
};
ostream& operator<<(ostream &o, const Value &v){
  o << v.value << "->";
  return o;
}

int main(){
  List<Value> l;
  for(int i = 0; i < 10; ++i){
    l.push_back(Value(i));
  }
  l.show();
}
posted @ 2018-08-20 21:01  小石王  阅读(1112)  评论(0编辑  收藏  举报