第16章 模板与泛型编程(12) (一)

2014-11-24 12:24:44 · 作者: · 浏览: 6

16.4.6 完整的Queue类

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

template
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<< (ostream &os, const Queue &q);

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

template void Queue::destroy(){
while(!empty())
pop();
}

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

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

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

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

template
template
void Queue::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
using namespace std;

template
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<< (ostream &os, const Queue &q);

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

template void Queue::destroy(){
while(!empty())
pop();
}

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

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

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

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

template
template
void Queue::assign(Iter beg, Iter end){
destroy();
copy_elems(beg,end);
}
#endif16.4.7 类模板的static成员

类模板可以像任何其他类一样声明static成员。

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

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

template
T Foo::ctr;

静态数据成员需要在类外