定义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)。

posted on 2022-06-28 17:21  zwhyh  阅读(255)  评论(0)    收藏  举报

导航