#include<iostream>
using namespace std;
class Customer
{
friend class BankQueue;//将BankQueue定义为Customer的友元类
private:
int _account;//银行账号
int _amount;//金额
public:
Customer(int account=-1,int amount=0):_account(account),_amount(amount)
{};
int GetAccount()
{
return _account;
}
int GetAmount()
{
return _amount;
}
};
const int SIZE=100;
class BankQueue
{
public:
BankQueue();
void EnQueue(Customer newElem);//元素入队列
Customer DelQueue();
int GetLength()
{
return length;
}
void Print() const;
private:
Customer elem[SIZE];
int frist;
int length;
};
BankQueue::BankQueue()
{
frist=length=0;
}
void BankQueue::EnQueue(Customer newElem)
{
int pos=(frist+length)%SIZE;
elem[pos]=newElem;
length++;
}
Customer BankQueue::DelQueue()
{
//类Customer和类BankQueue是俩个彼此独立的类,但Customer类中将BankQueue类
//声明为友元类,所以BankQueue成员函数可以通过Customer对象访问Customer的
//私有成员
Customer ret(elem[frist]._account,elem[frist]._amount);
frist=(frist+1)%SIZE;
length--;
return ret;
}
void BankQueue::Print()const
{
int pos=frist;
cout<<"Queue:"<<endl;
for(int i=0;i<length;i++)
{
//此处如上
cout<<"account:"<<elem[pos]._account<<"amount:"<<elem[pos]._amount<<endl;
pos=(pos+1)%SIZE;
}
cout<<endl;
}
void main()
{
BankQueue q;
int i;
for(i=0;i<6;i++)
{
q.EnQueue(Customer(i,20*i));
}
q.Print();
Customer a;
for(i=0;i<3;i++)
{
a=q.DelQueue();
//main函数不是Customer的友元函数,只能通过公有成员函数访问Customer的私有成员
cout<<"Out queue:"<<a.GetAccount()<<" "<<a.GetAmount()<<endl;
}
cout<<endl;
q.Print();
}
使用有元函数的条件:
1.一个函数需要经常而且大量的访问一个类的数据成员时;
2.一个类属于另一个类,而且一般不会单独使用,而是通过另一个类的对象来发挥作用。
3.运算法重载。
注意事项:
1.friend不是双向的。
2.友元不是类的成员。
3.除了一般的函数可以是有元函数外,类的成员函数也是可以成为另一个类的有元函数,需要加上类域说明。