类模板
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();
}