即使不包含其标头,如何成功向前声明的类编译?
How can forward declared class compile successfully even without including its header?
ClassA 有一个指向 Class B 的成员指针。我还添加了 B 类的前向声明作为指针 b 的参考。我在 ClassA.h 和 ClassA.cpp 中没有 #include"ClassB.h"。此代码生成时没有错误。
我很困惑,仅正向声明就足以成功编译此代码吗?如果不需要标头,则转发类的引用是什么?
我检查了其他可能的重复项,但它并没有澄清我的困惑,因为我没有要求在这里修复代码。
谁能澄清我的困惑。
A.h 级
#ifndef CLASS_A
#define CLASS_A
#include <string>
class ClassB;
class ClassA
{
ClassB *b;
};
#endif
A类.cpp
#include "ClassA.h
班B.h
#ifndef CLASS_B
#define CLASS_B
#include <vector>
#include "ClassA.h"
class ClassB
{
std::vector<ClassA> a;
};
#endif
B类.cpp
#include "ClassB.h"
我很困惑,仅靠正向声明就足以成功编译此代码?
class ClassB; class ClassA { ClassB *b; };
这个片段不需要知道ClassB
的定义,所以它不需要包含该定义。知道类型存在就足够了,以便声明指向该类型的指针。类的声明实现了这一点。
相关文章:
- .cpp和.h文件中的模板专用化声明
- 未在作用域中声明unordered_map
- C++避免重复声明的语法是什么
- 如何确保C++函数在定义之前声明(如override关键字)
- cmake在我的项目中所需的所有静态库都不成功
- 错误:未在此范围内声明'reverse'
- 奇怪的(对我来说)返回声明 - 在谷歌上找不到任何关于它的信息
- 为什么在定义函数之前先声明它
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- 尽管测试成功,CppUnit测试核心仍被丢弃.为什么
- #ifdef和未声明的标识符
- 没有显式声明的int[]中的foreach
- 在基于范围的for循环中使用结构化绑定声明
- 在将变量声明为引用时,堆在释放后使用
- C++:无法访问声明的受保护成员
- 为什么我不能在一个类的不同行中声明和定义成员变量?
- 即使不包含其标头,如何成功向前声明的类编译?
- 声明全局变量 <vector>,代码将无法成功运行
- 在测试已声明但未定义的运算符是否存在时,static_assert真的应该成功吗?
- 为什么程序的成功取决于是否声明了重载构造函数