头文件中的空类声明

Empty class declaration in header file?

本文关键字:声明 文件      更新时间:2023-10-16

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

这是一个前向声明

它只是通知编译器稍后将定义名为 Robot 的类模板,并且它应该需要该定义。

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

这是避免循环依赖关系并最大程度地减少编译时间/开销的常见策略。

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

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

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

称为"前向声明"。 您告诉编译器"有一个名为 Robot 的类。 我不是在解释它是什么样子,但要知道它存在"。 这样,编译器在看到您在定义中使用Robot时不会抛出"未定义的标识符"错误Happy。 但是,您仍然必须在某处包含Robot的完整定义,否则最终会出现链接器错误。

当对象需要引用在 .h 文件中更下方定义的内容时,或者当两个对象需要相互引用时,通常会看到使用此方法。