欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

c/c++ 类模板初探

程序员文章站 2022-12-29 14:53:32
类模板 1,模板类里的函数都是模板函数 2,模板类里的函数,在类外面实现的时候,要用模板函数(方法:push_back)的方式实现,在类内部实现时,不需要用模板函数(方法:show)方式实现。 3,用模板类实现单链表,类List是类ListNode的友元类;用友元函数重载了类Value的 using ......

类模板

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