定义X,Y,Z,函数h(X*),满足:类X有私有成员i,Y的成员函数g(X*)是X的友元函数,实现对X的 成员i加1;类Z是类X的友元类,其成员函数f(X*)实现对X的成员i加5;函数h(X*)是X的友元函数,实现对 X的成员i加10.在一个文件中定义和实现类,在另一个文件中实现main()函数。
1、定义
class x{……
private:
int i;
}
class Y{……}
class Z{……}
后会报错,发现类Y的成员函数g(X*)无法访问类X的成员函数。这是因为类X定义在类Y前,编译器不知道有Y这个类。
即使在第一行声明了“class Y;”,编译器也无法知道类Y中究竟有什么,所以在类X中声明g(X*)为友元函数是没有用的。
2、我们修改代码后
class X;
class Y{
public:
void g(X &x){
x.i++;
};
};
class x{……
private:
int i;
}
class Z{……}
发现依旧会报错,因为只是声明了类X,并没有对其进行具体的定义,不知道其成员函数和数据成员。
3、最后,我们将g(X*)具体的实现放在类X后即可,完整代码如下:
//"dingyi.h"
#ifndef _FUN1_
#define _FUN1_
#include <iostream>
using namespace std;
class X;
class Y{
public:
void g(X &x){
x.i++;
};
};
class X{
public:
X(int i):i(i){}
friend void Y::g(X &x);
friend class Z;
friend int h(X &x);
void show();
private:
int i;
};
int h(X &x){
x.i+=10;
}
void X::show(){
cout<<i<<"\n";
}
class Z{
public:
void f(X &x);
};
void Z::f(X &x){
x.i+=5;
}
#endif
//"main.cpp"
int main(){
X x(5);
x.show();
Y y;
y.g(x);
x.show();
Z z;
z.f(x);
x.show();
h(x);
x.show();
}
最后的结果为5 6 11 21。
h(x)为友元函数,但并非成员函数,不要写成x.h(x)。
浙公网安备 33010602011771号