内部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:\users\e543925\documents\visual studio 2005\projects\myproject\filetwo.h
2--error C2027: use of undefined type 'FileOne' c:\users\e543925\documents\visual studio 2005\projects\myproject\filetwo.h
3--error C2228: left of '.var1' must have class/struct/union c:\users\e543925\documents\visual studio 2005\projects\myproject\filetwo.h
4--error C2228: left of '.var2' must have class/struct/union c:\users\e543925\documents\visual studio 2005\projects\myproject\filetwo.h
我找到了一种解决方法,例如在FileTwo.cpp中定义Test函数。但是我想知道如何在头文件中解决上述问题。
最佳答案
这里的问题是您要同时包含两个文件。当您的编译器解析FileOne.h
时,它包括FileTwo.h
,因此它将读取该信息,并跳过FileOne.h
(由于包含了include防护;否则,您将陷入无限循环),并尝试使用尚未定义的FileOne
类。
实际上,这就像您没有在FileOne.h
中包括FileTwo.h
一样;您无法在One
上调用方法,因为尚未定义其类型(FileOne
)。与 friend 类无关。还是没有(您稍后会遇到此问题)。
从您的代码中,您似乎想要使用FileTwo
类来测试FileOne
。在这种情况下,FileOne
不需要真正了解FileTwo
,只需让它查看其内部即可(也可以使其成为 friend )。因此,您的代码可以归结为:
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