5

可能重复:
什么是 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> >;
  // ...
};
4

4 回答 4

7

这是一个前向声明

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

同时(即直到Robot正式定义),它允许程序员在代码中引用该类型。在您给出的示例中,有必要声明Robot为类friend的a Happy。(谁取了这些名字?!)

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

于 2012-04-13T21:37:53.770 回答
0

它基本上对其余代码说“您可以使用它,但我稍后会声明它”。如果没有该行,这段代码将无法编译: friend class Robot<Happy<T> >;

于 2012-04-13T21:38:54.473 回答
0

它被称为前向声明——它基本上是对编译器说的;“相信我,我将使用稍后定义的类”。但是因为编译器对机器人的成员一无所知,所以你只能在这里以只有一个指针(或引用)指向它的方式使用它。

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

于 2012-04-13T21:40:08.543 回答
0

这就是所谓的“前向声明”。您是在告诉编译器“有一个名为Robot. 的类。我没有解释它的外观,但请注意它的存在”。这样,当编译器看到你Robot在定义中使用Happy. 但是,您仍然必须在某个地方包含完整的定义Robot,否则最终会出现链接器错误。

当一个对象需要引用在 .h 文件中定义得更远的东西时,或者当两个对象需要相互引用时,您通常会看到这种用法。

于 2012-04-13T21:40:27.280 回答