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

2014-11-24 12:26:51 · 作者: · 浏览: 3

16.4.4 Queue和QueueItem的友元声明

1. 将类模板设为友元

template
class QueueItem
{
QueueItem(const Type &t):item(t), next(0){}
Type item;
QueueItem *next;
friend class Queue;
};
template
class QueueItem
{
QueueItem(const Type &t):item(t), next(0){}
Type item;
QueueItem *next;
friend class Queue;
};2. Queue输出操作符

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
ostream& operator<<(ostream &os, const Queue &q)
{
os<<"< ";
QueueItem *p;
for(p=q.head;p!=0;p=p->next)
{
os<item<<" ";
}
os<<">";
return os;
}3. 将函数模板设为友元

template
class QueueItem
{
Type item;
QueueItem *next;
QueueItem(const Type &t):item(t), next(0){}
friend class Queue;
friend ostream &operator<< (ostream &os, const Queue &q);
};
template
class QueueItem
{
Type item;
QueueItem *next;
QueueItem(const Type &t):item(t), next(0){}
friend class Queue;
friend ostream &operator<< (ostream &os, const Queue &q);
};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);
private:
QueueItem *head;
QueueItem *tail;
void destroy();
void copy_elems(const Queue&);
};
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);
private:
QueueItem *head;
QueueItem *tail;
void destroy();
void copy_elems(const Queue&);
};4. 类型依赖性与输出操作符

绑定到Queue且使用Queue输出操作符的每种类型本身必须有输出操作符。

摘自 xufei96的专栏