C++ 友元函数不起作用(有多个头文件和源文件)

巨人

我试图在互联网上找到解决方案,但我总是发现类、主函数等写在一个文件中的例子,而不是分开的。也许这就足够了,但我是 C++ 新手,我想我的问题是不同的,因为我为每个类使用不同的头文件和源文件,而为 main() 使用不同的源文件。
所以,问题是:我试图使 Box2 类中的 printBoxMeretek(Box) 函数成为 Box 类的友元函数。它不起作用,我不知道为什么。当我让整个 Box2 班级成为 Box 班级的朋友时,一切都很好。如果我只希望 printBoxMeretek(Box) 函数成为朋友,而不是整个 Box2 类,我该怎么办?
无论如何,错误消息表明问题在于 Box 类中的 boxSzelesseg 和 boxMagassag 变量是私有的。但据我所知,友元函数应该能够处理私有变量。
以下是我的测试文件的内容:
Box.h

#ifndef BOX_H
#define BOX_H

class Box
{
    //friend function from Box2 [can be written anywhere: in private, in public,etc section] =>It does NOT work...why???
    friend void printBoxMeretek(Box);

    //make the whole Box2 class friend =>It works well.
//    friend class Box2;

    public:
};

#endif // BOX_H


框2.h

#ifndef BOX2_H
#define BOX2_H

#include <iostream>
#include <Box.h>

class Box2
{
    public:
        void printBoxMeretek(Box)
        { }
};

#endif // BOX2_H


感谢您的帮助。

阿空加瓜
friend void printBoxMeretek(Box);

这声明了一个自由函数是 Box 的朋友。你想让一个成员函数成为朋友,所以你应该声明一个这样的:

class Box2;
class Box
{
    friend void Box2::printBoxMeretek(Box);
};

现在的问题是,您需要完整的类声明,因此:

class Box;
class Box2;
{
public:
    void printBoxMeretek(Box);
};

class Box
{
    friend void Box2::printBoxMeretek(Box);
};

无论您是在同一个标​​题中还是在其中两个标题中都有这个都没有关系 - 问题仍然存在(即您需要从 Box.h 中包含 Box2.h)。

旁注(感谢 Martin 的澄清):即使使用Boxclass声明了一个函数,类的完整定义只需要在您定义调用该函数时可用,因此它可以正常工作。您只需要确保在执行其中之一的任何地方都包含两个标头(或者始终包含 Box.h,它隐含地随 Box2.h 一起提供)。

不过,您可能更喜欢参考。你的盒子类在我看来并不像你真的打算在每次调用 print 函数时复制它们:

void Box2::printBoxMeretek(Box const& b);

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么多个头文件和源文件中的 C++ 继承不起作用?

在C中链接多个头文件

如何在C ++中将多个头文件导出为单个头文件?

C头文件和源文件结构

C ++在多个源文件中包含具有相同类实现的不同头文件

C++ 增量运算符重载作为友元函数不起作用?

用于导出以及C和C ++ API的单个头文件

为什么 C++ 标准将容器类拆分为多个头文件?

C 中的 ADT(使用头文件、源文件和主文件)

为什么我的文件在 C 中分叉时即使有守卫也执行两次这个头文件?

多个源文件中的C ++ :: #include:ing模板类头文件?

在C ++中从头文件到源文件中实现typedef函数

如何在另一个头文件中包含c头文件?

文件选择器中的C ++头文件/源文件

使用 Windows 窗体通信 C++ 头文件和源文件

C++ 头文件和源文件 - 包含哪些内容和顺序

C源文件包含其自己的头文件有什么好处

C加号有关在头文件或源文件中定义静态数据成员的信息

如何在 C 编程中将两个头文件和 3 个 c 文件链接到一个可执行文件中?

如何安装 C 源文件和头文件?

在C ++中链接结构和函数而无需头文件

C#使用`[]`保存具有特定文件名的excel文件不起作用

将头文件与C和C ++关联

没有头文件的C / C ++程序

C++ - 在另一个头文件中包含一个头文件以使全局变量可用于数组声明

具有结构和typedef的c头文件和.c文件

在多个 .c 源中使用头文件

在C ++中使用另一个头文件中的抽象类

C ++:如何初始化使用两个头文件的对象?