程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 第16章 模板與泛型編程(12)

第16章 模板與泛型編程(12)

編輯:C++入門知識

16.4.6 完整的Queue類

//Queue.h  
#ifndef QUEUE_H  
#define QUEUE_H  
#include "stdafx.h"  
#include "QueueItem.h"  
#include <iostream>  
using namespace std; 
 
template <class Type> 
class Queue{ 
public: 
    Queue():head(0), tail(0){} 
    Queue(const Queue &Q):head(0), tail(0) 
    {copy_elems(Q);} 
    Queue& operator=(const Queue&); 
    ~Queue(){destroy();} 
    Type& front() 
    {return head->item;} 
    const Type &front() const{return head->item;} 
    void push(const Type &); 
    void pop(); 
    bool empty() const 
    {return head==0;} 
    friend ostream &operator<< <Type>(ostream &os, const Queue<Type> &q); 
 
    template<class It> 
    Queue(It beg, It end):head(0), tail(0){copy_elems<It>(beg,end)} 
    template<class Iter> 
    void assign(Iter, Iter); 
private: 
    QueueItem<Type> *head; 
    QueueItem<Type> *tail; 
    void destroy(); 
    void copy_elems(const Queue&); 
    template <class Iter> 
    void copy_elems(Iter,Iter); 
}; 
 
template<class Type> void Queue<Type>::destroy(){ 
    while(!empty()) 
        pop(); 

 
template<class Type> void Queue<Type>::pop(){ 
    QueueItem<Type> *p=head; 
    this->head=this->head->next; 
    delete p; 

 
template<class Type> void Queue<Type>::push(const Type &p){ 
    QueueItem<Type> *pt=new QueueItem<Type>(p); 
    if(empty()){ 
        pt->next=0; 
        head=tail=pt; 
    } 
    else{ 
        this->tail->next=pt; 
        tail=pt; 
    } 

 
template <class Type> 
void Queue<Type>::copy_elems(const Queue &orig){ 
    for(QueueItem<Type> *pt=orig.head;pt==0;pt=pt->next){ 
        push(pt->item); 
    } 

 
template <class Type> 
ostream& operator<<(ostream &os, const Queue<Type> &q){ 
    os<<"< "; 
    QueueItem<Type> *p; 
    for(p=q.head;p!=0;p=p->next){ 
        os<<p->item<<" "; 
    } 
    os<<">"; 
    return os; 

 
template<class Type> 
template<class Iter> 
void Queue<Type>::assign(Iter beg, Iter end){ 
    destroy(); 
    copy_elems(beg,end); 

#endif 
//Queue.h
#ifndef QUEUE_H
#define QUEUE_H
#include "stdafx.h"
#include "QueueItem.h"
#include <iostream>
using namespace std;

template <class Type>
class Queue{
public:
 Queue():head(0), tail(0){}
 Queue(const Queue &Q):head(0), tail(0)
 {copy_elems(Q);}
 Queue& operator=(const Queue&);
 ~Queue(){destroy();}
 Type& front()
 {return head->item;}
 const Type &front() const{return head->item;}
 void push(const Type &);
 void pop();
 bool empty() const
 {return head==0;}
 friend ostream &operator<< <Type>(ostream &os, const Queue<Type> &q);

 template<class It>
 Queue(It beg, It end):head(0), tail(0){copy_elems<It>(beg,end)}
 template<class Iter>
 void assign(Iter, Iter);
private:
 QueueItem<Type> *head;
 QueueItem<Type> *tail;
 void destroy();
 void copy_elems(const Queue&);
 template <class Iter>
 void copy_elems(Iter,Iter);
};

template<class Type> void Queue<Type>::destroy(){
 while(!empty())
  pop();
}

template<class Type> void Queue<Type>::pop(){
 QueueItem<Type> *p=head;
 this->head=this->head->next;
 delete p;
}

template<class Type> void Queue<Type>::push(const Type &p){
 QueueItem<Type> *pt=new QueueItem<Type>(p);
 if(empty()){
  pt->next=0;
  head=tail=pt;
 }
 else{
  this->tail->next=pt;
  tail=pt;
 }
}

template <class Type>
void Queue<Type>::copy_elems(const Queue &orig){
 for(QueueItem<Type> *pt=orig.head;pt==0;pt=pt->next){
  push(pt->item);
 }
}

template <class Type>
ostream& operator<<(ostream &os, const Queue<Type> &q){
 os<<"< ";
 QueueItem<Type> *p;
 for(p=q.head;p!=0;p=p->next){
  os<<p->item<<" ";
 }
 os<<">";
 return os;
}

template<class Type>
template<class Iter>
void Queue<Type>::assign(Iter beg, Iter end){
 destroy();
 copy_elems(beg,end);
}
#endif16.4.7 類模板的static成員

類模板可以像任何其他類一樣聲明static成員。

template<class T> 
class Foo{ 
public: 
    static T count(){return ctr;} 
private: 
    static T ctr; 
}; 
 
template<class T> 
T Foo<T>::ctr; 
template<class T>
class Foo{
public:
 static T count(){return ctr;}
private:
 static T ctr;
};

template<class T>
T Foo<T>::ctr;

靜態數據成員需要在類外初始化。

1. 使用類模板的static成員

Foo<int> fi, fi2; 
Foo<int>::count(); 
size_t ct=fi.count(); 
ct=fi2.count(); 
 Foo<int> fi, fi2;
 Foo<int>::count();
 size_t ct=fi.count();
 ct=fi2.count();可以通過類類型的對象訪問模板的static成員,或者通過使用作用域操作符直接訪問成員。當然,當試圖通過類使用static成員的時候,必須引用實際的實例化。

與任意其他成員函數一樣,static成員函數只有在程序中使用時才進行初始化。

2. 定義static成員

像使用任意其他static數據成員一樣,必須在類外部出現在數據成員的定義。在類模板含有static成員的情況下,成員定義必須指出它是類模板的成員。

template<class T> 
T Foo<T>::ctr; 

 摘自 xufei96的專欄
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved