2012-04-13 107 views
4

可能重复:
What is forward declaration in c++?头文件中的空类声明?

我只是有一个什么一段代码在这个简单的例子是干什么的问题。我查了好友类并了解它们是如何工作的,但我不明白顶层的类声明实际上在做什么(即机器人)。这是否意味着Happy类可以使用Robot对象,但他们无法访问其私有部分,任何信息将不胜感激。

#include <stdlib.h> 
#include <stdexcept> 

template <typename T> // What is this called when included 
class Robot;   // is there a special name for defining a class in this way 

template <typename T> 
class Happy 
{ 
    friend class Joe<T>; 
    friend class Robot<Happy<T> >; 
    // ... 
}; 
+0

http://stackoverflow.com/questions/4926105/what-is-forward-declaration-in-c – mydogisbox 2012-04-13 21:36:36

回答

4

这是一个正向声明

它只是在那里通知编译器名为Robot的类模板将在稍后定义,并且它应该期望该定义。

与此同时(即,直到Robot被正式定义),它允许程序员在代码中引用该类型。在你给出的例子中,有必要声明RobotHappy类的friend。 (谁挑这些名字?!)

这是避免循环依赖和最小化编译时间/开销的常用策略。

+0

+1,常用的术语是*前置声明*,即使正式术语只是*声明* 。通常会添加* forward *以使其明确表示我们只处理声明而不处理* definition *(这也是*声明*) – 2012-04-13 22:01:11

+0

我选择了名称haha – Ockham 2012-04-14 00:23:31

+0

我正在开发一个项目,类'B'头文件中类“A”的前向声明。我注意到我可以评论前向声明,而是导入类“A”的头文件,并且似乎工作相同。 是否有使用其中一个的理由? – Gonzalo 2015-08-09 19:03:12

0

它基本上对代码的其余部分说“你可以使用这个,但我稍后会声明它”。 如果没有这一行,这段代码不会编译: friend class Robot<Happy<T> >;

0

这就是所谓的正向声明 - 它基本上是说给编译器; “相信我,我会用一个我将在后面定义的课程”。但是因为编译器不知道机器人成员的任何信息,所以只能在其中只有一个指针(或引用)的地方使用它。

这是因为否则您需要在此标头中包含机器人标题,这可能会导致其他循环依赖。

0

这就是所谓的“前向声明”。你正在告诉编译器“有一个类叫做Robot。我没有解释它的外观,但要知道它存在”。这样,编译器在看到您在Happy的定义内使用Robot时不会抛出“未定义的标识符”错误。不过,您仍然必须在某个地方包含Robot的完整定义,否则最终会出现链接器错误。

当一个对象需要引用在.h文件中更下面定义的内容时,或者当两个对象需要相互引用时,您通常会看到这种情况。