即使不包含其标头,如何成功向前声明的类编译?

How can forward declared class compile successfully even without including its header?

本文关键字:成功 声明 编译 包含其 何成功      更新时间:2023-10-16

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的定义,所以它不需要包含该定义。知道类型存在就足够了,以便声明指向该类型的指针。类的声明实现了这一点。