在包含朋友的类中包含头文件

JDN*_*JDN 4 c++ class friend

我想知道你是否必须在一个使用它作为朋友的类中使用#include"Class1.h".例如,授予Class1类权限的类的.h文件.

class Class2 {
   friend class Class1;
}
Run Code Online (Sandbox Code Playgroud)

你需要#include"Class1.h"还是没有必要?同样在Class2类中,永远不会创建或使用Class1对象.Class1只是操纵Class2而不是相反.

Stu*_*etz 8

语法是:

friend class Class1;
Run Code Online (Sandbox Code Playgroud)

不,你不包括标题.

更一般地说,除非您实际上以某种方式使用类定义(例如,您使用类的实例并且编译器需要知道其中的内容),否则您不需要包含标头.如果您只是通过名称引用类,例如,您只有一个指向类实例的指针并且您正在传递它,那么编译器不需要查看类定义 - 它足以告诉它关于这个类的声明:

class Class1;
Run Code Online (Sandbox Code Playgroud)

这很重要有两个原因:次要原因是它允许你定义相互引用的类型(但你不应该!); 主要的是它允许您减少代码库中的物理耦合,这有助于减少编译时间.


要回答Gary的评论,请注意这个编译并链接正常:

class X;

class Y
{
    X *x;
};

int main()
{
    Y y;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

除非您实际使用X中的某些内容,否则无需提供X的定义.

  • 始终在发布到SO之前编译代码:) (2认同)