内部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

10-08 00:31