首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >与好友函数混淆

与好友函数混淆
EN

Stack Overflow用户
提问于 2013-01-03 16:09:41
回答 4查看 605关注 0票数 2

内部FileTwo.h

代码语言:javascript
复制
#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

代码语言:javascript
复制
#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内幕

代码语言:javascript
复制
#include<iostream>
using namespace std ;
#include"FileOne.h"
#include"FileTwo.h"

int main(){
FileOne one ;
FileTo two ;
cout<<two.Test(one);
}

在编译过程中,我得到了以下错误

代码语言:javascript
复制
   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中定义测试函数。但是我想知道如何在头文件中解决上面的问题。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-01-03 16:17:36

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

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

从您的代码看,您似乎想要使用FileTwo类来测试FileOne。在这种情况下,FileOne实际上不需要对FileTwo有太多的了解,只需要让它看一看它的内部(也就是让它成为朋友)。所以你的代码可以归结为:

FileOne.h:

代码语言:javascript
复制
#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:

代码语言:javascript
复制
#ifndef FILETWO
#define FILETWO
#include"FileOne.h"
class FileTwo
{
public:
  int Test(FileOne One) {
    return (One.var1+One.var2);
  }

  FileTwo();
  ~FileTwo();
};
#endif
票数 2
EN

Stack Overflow用户

发布于 2013-01-03 16:14:26

您不需要在FileTwo.h中包含FileOne.h,至少在这个简单的示例中是这样。但通常情况下,循环包含表示您的设计有问题。

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

票数 1
EN

Stack Overflow用户

发布于 2013-01-03 16:26:30

您所拥有的是循环依赖,这可以通过使用不完整的类型声明来解决。现在,您的代码需要在这两个文件中都有完整的类型声明:

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中定义测试函数。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14135123

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档