当只有声明存在时不包括 class header

Don't including class header when only declaration exists

我有以下情况:

class_a.hpp:

#include "class_b.hpp" // is this "include" mandatory?
class class_a{
private:
    class_b b;
};

class_a.cpp:

#include "class_b.hpp"
//code that uses member variables and functions from class_b 

class_b.hpp:

class class_b{};

是否可以去掉class_a.hpp中的#include "class_b.hpp"?既然只是声明,为什么我不能只使用前向声明而不包括它呢? (我试了但是没有编译)

当然我在 class_a.cpp 中包含了 class_b.hpp

由于 class_b 需要存储在 class_a 中而没有任何间接 (例如指针)class_b 的大小需要在 class_a 的声明期间被知道。为了知道大小,class_b 的声明需要可用:因此需要 #include 指令。

why I can not just use forward declaration and not including it?

只有前向声明 class 类型 class_b 将是 incomplete type。但是要声明为非静态class数据成员,需要它是完整的,它的大小和布局必须知道。

Any of the following contexts requires class T to be complete:

...
declaration of a non-static class data member of type `T`;
...

(In general, when the size and layout of T must be known.)