头文件中的空类声明
Empty class declaration in header file?
可能的重复项:
什么是 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 文件中更下方定义的内容时,或者当两个对象需要相互引用时,通常会看到使用此方法。
- .cpp和.h文件中的模板专用化声明
- 在 .h 文件中的类中声明静态变量和在.cpp文件中声明"global"变量有什么区别
- 用"=default"声明的函数应该只在头文件中执行
- 调用在 HXX 文件中声明的静态数据成员
- 如何在 c++ 的不同文件中声明类?
- 如何在头文件中声明类模板(由于循环依赖关系)
- 声明要在 qml 和 cpp 文件中使用的全局字符串
- 在.cpp文件之间传递结构声明,而不使用全局头文件
- 为什么要将函数声明和定义放在单独的文件中
- 枚举前向声明与头文件
- 在命名空间中声明变量,在 main 中定义它,使其对所有其他文件可见
- 在带有类型保护的模板文件中使用前向声明
- 在指向现有内存地址的 hpp 文件中声明成员函数的最佳方法
- 在多个头文件中从接口声明被覆盖的函数时,如何避免重复代码?
- 当我可以在头文件中声明和定义所有文件时,为什么要创建一个.cpp文件?
- 文件存在时的最新检查声明生成输入"is missing"
- 在实现文件中使用模板参数声明方法
- 包含文件中的 Typdef "未在此范围内声明"
- 带有正向声明的Co-Dependent.h文件
- 无法声明文件指针数组