2

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 函数。但我想知道如何在头文件中解决上述问题。

4

4 回答 4

2

您的问题是您将两个文件都包含在彼此中。当您的编译器进入 parseFileOne.h时,它​​包含FileTwo.h,因此它会读取,跳过FileOne.h(感谢 include 保护;否则,您将进入无限循环)并尝试使用FileOne尚未定义的 class 。

实际上,这就像您没有包含FileOne.hFileTwo.h; 您不能调用方法,One因为它的类型 ( FileOne) 尚未定义。与朋友班无关。或者还没有(稍后你会遇到这个问题)。

从您的代码来看,您似乎想使用 class FileTwoto test FileOne。在这种情况下,FileOne并不需要了解太多FileTwo,只需让它看看它的内脏(也就是让它成为朋友)。所以你的代码可以归结为:

文件一.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

文件二.h:

#ifndef FILETWO
#define FILETWO
#include"FileOne.h"
class FileTwo
{
public:
  int Test(FileOne One) {
    return (One.var1+One.var2);
  }

  FileTwo();
  ~FileTwo();
};
#endif
于 2013-01-03T08:17:36.157 回答
1

至少在这个简单的示例中,您不需要包含FileOne.hinside 。FileTwo.h但总的来说,循环包含意味着您的设计有问题。

你必须让整个班级成为朋友,而不仅仅是一个方法。我也会重新考虑这种友谊,因为这会引入类之间的主要耦合。你不能用公共方法完成同样的事情吗?

于 2013-01-03T08:14:26.270 回答
1

你所拥有的是一个循环依赖,它可以通过使用不完整的类型声明来解决。就目前而言,您的代码需要在两个文件中进行完整的类型声明:

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 函数。

#include "FileOne.h"在这种情况下从 FileTwo.h 中删除。

于 2013-01-03T08:26:30.023 回答
1

您的朋友声明很好,您遇到的问题是circular include。您可以通过将类实现之一放入 cpp 文件来打破循环包含。

例如,将 FileTwo 类分解为 FileTwo.h 和 FileTwo.cpp 应该可以解决您的问题。或者,声明friend FileTwo;一个前向声明就足够了:

文件一.h

#ifndef FILEONE
#define FILEONE

class FileTwo;
class FileOne
{
private:
     int var1 , var2 , var3 ;
public :
    friend FileTwo;
    FileOne(){
        var1= 12;var2 = 24;
    }

};
#endif

文件二

#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
于 2013-01-03T08:34:49.860 回答