2012-04-11 44 views
4

我想知道是否必须在使用该类作为朋友的类中包含“Class1.h”。例如,授予对Class1类的权限的类的.h文件。在朋友的课堂中包含头文件

class Class2 { 
    friend class Class1; 
} 

你需要#include“Class1.h”还是没有必要?同样在Class2类中,从不创建或使用Class1对象。 Class1从来没有反过来操纵Class2。

回答

8

的语法是:

friend class Class1; 

不,你不包括头。更一般地说,除非实际上以某种方式使用类定义(例如,使用类的实例并且编译器需要知道其中的内容),否则不需要包含头。如果您只是按名称引用课程,例如你只需要一个指向类的实例的指针,然后编译器不需要看类定义 - 只要声明它就可以告诉它类:

class Class1; 

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


要回答Gary的评论,可观察到该编译和链接罚款:

class X; 

class Y 
{ 
    X *x; 
}; 

int main() 
{ 
    Y y; 
    return 0; 
} 

无需提供X的定义除非你实际使用的东西,从十

+0

我的坏。我没有写在实际的代码中,虽然 – JDN 2012-04-11 20:27:08

+2

在发布到SO之前总是编译你的代码:) – 2012-04-11 20:27:55

+0

只要类最终包含在同一个二进制文件中(否则在链接过程中会出错) – 2012-04-11 20:33:08