与好友功能混淆
confused with friend function
Inside FileTwo.h
#ifndef FILETWO
#define FILETWO
#include"FileOne.h"
class FileOne ;
class FileTwo
{
public:
int Test(FileOne One){
return (One.var1+One.var2);}
FileTwo(void);
~FileTwo(void);
};
#endif
在FileOne.h #ifndef FILEONE
#define FILEONE
#include"FileTwo.h"
class FileTwo ;
class FileOne
{
private:
int var1 , var2 , var3 ;
public :
friend int FileTwo::Test(FileOne One);
FileOne(){
var1= 12;var2 = 24;
}
};
#endif
在main.cpp #include<iostream>
using namespace std ;
#include"FileOne.h"
#include"FileTwo.h"
int main(){
FileOne one ;
FileTo two ;
cout<<two.Test(one);
}
在编译过程中,我得到了以下错误
1-- error C2027: use of undefined type 'FileOne' c:userse543925documentsvisual studio 2005projectsmyprojectfiletwo.h
2--error C2027: use of undefined type 'FileOne' c:userse543925documentsvisual studio 2005projectsmyprojectfiletwo.h
3--error C2228: left of '.var1' must have class/struct/union c:userse543925documentsvisual studio 2005projectsmyprojectfiletwo.h
4--error C2228: left of '.var2' must have class/struct/union c:userse543925documentsvisual studio 2005projectsmyprojectfiletwo.h
我发现了一个解决方案,如在FileTwo.cpp中定义Test函数。但我想知道如何在头文件内解决上述问题。
您的问题是您将两个文件都包含在彼此中。当你的编译器去解析FileOne.h
,它包括FileTwo.h
,所以它读,跳过FileOne.h
(感谢包含警卫;否则,您将进入一个无限循环),并尝试使用尚未定义的FileOne
类。
在实践中,这就好像你没有在FileTwo.h
中包含FileOne.h
;你不能在One
上调用方法,因为它的类型(FileOne
)还没有定义。跟朋友课没关系。或者还没有(稍后会遇到这个问题)。
从您的代码中,看起来您想使用FileTwo
类来测试FileOne
。在这种情况下,FileOne
实际上不需要了解FileTwo
,只需要让它看看它的内部结构(也就是和它交朋友)。所以你的代码可以归结为:
FileOne.h:
#ifndef FILEONE
#define FILEONE
class FileOne
{
friend class FileTwo; // This is all FileOne needs from FileTwo
private:
int var1 , var2 , var3 ;
public :
FileOne(){
var1= 12;var2 = 24;
}
};
#endif
FileTwo.h:
#ifndef FILETWO
#define FILETWO
#include"FileOne.h"
class FileTwo
{
public:
int Test(FileOne One) {
return (One.var1+One.var2);
}
FileTwo();
~FileTwo();
};
#endif
您不需要在FileTwo.h
中包含FileOne.h
,至少在这个简单的示例中是这样。但一般来说,循环包含意味着你的设计有问题。
你必须让整个类成为朋友,而不仅仅是一个方法。我也会重新考虑这种友谊,因为这引入了类之间的主要耦合。难道你不能用公共方法实现同样的目的吗?
这是一个循环依赖,可以通过使用不完整的类型声明来解决。目前,您的代码需要在两个文件中声明完整的类型:
1)在FileOne.h: friend int FileTwo::Test(FileOne One);
(你要求编译器找到FileTwo
的成员函数)
2)在FileTwo.h: int Test(FileOne One){
return (One.var1+One.var2);}
(你要求编译器找到FileOne
的一些成员变量)
您必须在至少一个文件(class FileOne;
class FileTwo;
)中使用不完整类型声明。您已经在尝试这样做了,但是使用#include
指令破坏了这一点。您有两个选项:
一种方法是将FileTwo
作为FileOne
的友类,因为这是通过使用不完全类型实现的。删除#include "FileTwo.h"
.
另一个你已经自己找到了:
我找到了一个解决方案,如在FileTwo.cpp中定义Test函数。
从FileTwo.h中删除#include "FileOne.h"
您的朋友声明很好,您遇到的问题是circular include
。您可以通过将其中一个类实现放入cpp文件来打破循环包含。
例如,将FileTwo类分解为FileTwo.h和FileTwo.cpp应该可以解决您的问题。或者,声明friend FileTwo;
,那么一个前向声明就足够了:
FileOne.h
#ifndef FILEONE
#define FILEONE
class FileTwo;
class FileOne
{
private:
int var1 , var2 , var3 ;
public :
friend FileTwo;
FileOne(){
var1= 12;var2 = 24;
}
};
#endif
FileTwo.h
#ifndef FILETWO
#define FILETWO
#include "FileOne.h"
class FileTwo
{
public:
inline int Test(FileOne One)
{
return (One.var1+One.var2);
}
FileTwo(void){}
~FileTwo(void){}
};
#endif
- 有没有可能有一个只有ADL才能找到的非好友功能
- 解析模板的好友功能时出现问题
- 特定好友功能专业化
- 好友功能 - 成员无法访问
- 无法从好友功能访问类的私有成员?"ostream"不是"std"的成员?
- 好友功能仍无法访问私人会员
- CUDA C++中的好友功能
- 我无法获得好友会员功能以实际访问私人会员
- 好友功能没有访问私人成员
- 我无法正确使用好友功能
- 如何更恰当地处理好友功能
- 为什么我的好友功能无法访问私人会员?
- 好友功能和受保护的数据
- 选择何时使用好友功能
- 好友功能"non-lvalue in assignment"
- 好友功能无法访问私人数据成员
- 在C++中使用好友功能有什么额外的优势?
- 成员无法使用好友功能访问
- 即使将会员功能设为好友也无法访问会员
- 好友功能 - 无法访问私人字段C++