如何使一个文件的非成员函数与另一个文件中的 class 成为朋友?

How to make non-member function from one file friend with class in other file?

假设我有一个文件

// X.h(第一个文件)

#include <iostream>
class X{
    int x;
public:
    X(int i);
    void print_me();
};

// X.cpp(第二个文件)

#include "X.h"
X::X(int i){x = i}

void X::print_me(){std::cout<< x << endl;}

// main.cpp(第三个文件)

#include "X.h"

void swap(int lhs, int rhs){
  // do the swap
}

class Y{
   X x_obj;
public: 
    friend void swap(Y& lhs, Y& rhs){
        swap(lhs.x_obj.x, rhs.x_obj.x);
    }

};
int main(){return 0;}

我的问题是: 我怎样才能让 main.cpp 中的 class Y 成为 X 的朋友?

我正在考虑将 class Y 分解成 .h 和 .cpp 文件,然后将 Y.h 文件包含到 X.h 中,然后从那里开始。那还有什么办法吗。我的意思是在代码的当前条件下使 Y 成为 X 的朋友:

我在当前情况下得到的错误是:

> In file included from main.cpp:1:0: X.h: In function 'void swap(Y&,
> Y&)': X.h:3:9: error: 'int X::x' is private
>      int x;
>          ^ main.cpp:12:24: error: within this context
>          swap(lhs.x_obj.x, rhs.x_obj.x);
>                         ^ In file included from main.cpp:1:0: X.h:3:9: error: 'int X::x' is private
>      int x;
>          ^ main.cpp:12:37: error: within this context
>          swap(lhs.x_obj.x, rhs.x_obj.x);

My question is: How can I make class Y in main.cpp a friend of X?

Y 成为 X 的朋友并不能解决这个问题。您需要使函数 swap() 成为 class X 的朋友,因为它试图访问 X.

的私有成员
class Y; // forward declaration to avoid circular dependencies
class X{
    friend void swap(Y& lhs, Y& rhs);
    ...
};

请注意,您应该使用前向声明来避免将 Y.h 包含到 X.h 中,这会导致 circular dependency issue.