gpt4 book ai didi

c++ - 与 friend 功能混淆

转载 作者:搜寻专家 更新时间:2023-10-31 00:40:47 26 4
gpt4 key购买 nike

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

最佳答案

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

实际上,这就像您没有在 FileTwo.h 中包含 FileOne.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

文件二.h:

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

FileTwo();
~FileTwo();
};
#endif

关于c++ - 与 friend 功能混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14135123/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com