2 种方式的友谊和类之间的方法及其作为前向声明的解决方案

问题描述

我想知道是否有任何现有的解决方案:

class b;
class a {
  int x;

 public:
  friend class b;
  a() { x = 5 }
  void print(b obj) {
    cout << x << endl;
    cout << obj.y << endl;
  }
};

class b {
  int y;

 public:
  friend class a;
  b() { y = 10 }
  void print(a obj) {
    cout << y << endl;
    cout << obj.x << endl;
  }
};

“这给我带来了一个问题,因为 b 类主体没有在 a 类之前定义,那么有什么简单且现有的方法可以使其工作?

解决方法

对于初学者,您忘记在这些语句后放置分号

x = 5

y = 10

你可以定义访问其他类的数据成员的成员函数,当另一个类被定义时,它是一个完整的类型。

所以将类a的函数print的定义放在类b的定义之后。

例如

#include <iostream>
using namespace std;

class b;

class a {
  int x;

 public:
  friend class b;
  a() { x = 5; }
  /* inline */ void print(b obj);
};

class b {
  int y;

 public:
  friend class a;
  b() { y = 10; }
  void print(a obj) {
    cout << y << endl;
    cout << obj.x << endl;
  }
};

  void a::print(b obj) {
    cout << x << endl;
    cout << obj.y << endl;
  }

int main() 
{
    a a;
    
    a.print( b() );
    
    b b;
    
    b.print( ::a() );

    return 0;
}

程序输出为

5
10
10
5

您可以将带有成员函数声明的类定义放在头文件中,然后在 cpp 文件中定义成员函数。