zoukankan      html  css  js  c++  java
  • 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();
    }
    
  • 相关阅读:
    一、逻辑架构与存储引擎
    三、动态SQL
    九、装饰者模式
    二、Mapper映射文件
    八、适配器模式
    测试开发系列之Python开发mock接口(二)
    测试开发系列之Python开发mock接口(三)
    html基础
    seleniumWebdriver浏览器驱动信息汇总
    用30行代码开发一个上传、下载文件的接口
  • 原文地址:https://www.cnblogs.com/xiaoshiwang/p/9508071.html
Copyright © 2011-2022 走看看