如何使一个文件的非成员函数与另一个文件中的 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.
假设我有一个文件
// 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.