4.2.5 编程(www.cppentry.com)题(2)
解:类Y的成员函数g是类X的友元函数,参见4.1.1节中有关定义方法。另外,类Z是类X的友元类,参见4.1.2节中有关定义方法。X、Y、Z 3个类定义如下:
- #include <iostream.h>
- class X; //预先说明
- class Y
- {
- public:
- void g(X *);
- };
- class X
- { int i;
- public:
- X() { i=0; }
- friend void h(X *x) { x->i+=10; }
- friend void Y::g(X *);
- friend class Z;
- };
- class Z
- {
- public:
- void f(X *x) { x->i+=5; }
- };
- void Y::g(X *x) { x->i++; } //友元函数的实现
【例4.16】设计一个程序,其中有3个类,即CBank、BBank和GBank,分别为中国银行类、工商银行类和农业银行类。每个类都包含一个私有数据balance,用于存放储户在该行的存款数,另有一个友元函数total用于计算储户在这3家银行中的总存款数。类结构如图4.1所示。

解:CBank、BBank和GBank 3个类中均包含私有数据balance,以及其输入输出的相关函数和友元函数total()的说明,在最后定义该友元函数。程序如下:
- #include <iostream.h>
- class BBank; //预先说明,因为CBank中使用到BBank
- class GBank; //预先说明
- class CBank //定义中国银行类CBank
- { int balance;
- public:
- CBank() { balance=0;} //默认构造函数
- CBank(int b) { bbalance=b; } //构造函数
- void getbalance()
- { cout << "输入中国银行存款数:";
- cin >> balance;
- }
- void disp() {cout << "中国银行存款数:" << balance << endl;}
- friend void total(CBank,BBank,GBank);
- };
- class BBank //定义工商银行类BBank
- { int balance;
- public:
- BBank() { balance=0; } //默认构造函数
- BBank(int b) { bbalance=b; } //构造函数
- void getbalance()
- { cout << "输入工商银行存款数:";
- cin >> balance;
- }
- void disp()
- {cout << "工商银行存款数:" << balance << endl;}
- friend void total(CBank,BBank,GBank);
- };
- class GBank //定义农业银行类GBank
- { int balance;
- public:
- GBank() { balance=0; } //默认构造函数
- GBank(int b) { bbalance=b;} //构造函数
- void getbalance()
- { cout << "输入农业银行存款数:";
- cin >> balance;
- }
- void disp() { cout << "农业银行存款数:" << balance << endl; }
- friend void total(CBank,BBank,GBank);
- };
- void total(CBank A,BBank B,GBank C)
- { cout << " 总存款数:" << A.balance+B.balance+C.balance << endl; }
- void main()
- { CBank X(100);
- BBank Y;
- GBank Z;
- X.disp();
- Y.disp();
- Z.disp();
- Y.getbalance();
- Z.getbalance();
- total(X,Y,Z);
- }