【问题标题】:Don't including class header when only declaration exists [duplicate]仅存在声明时不包括类头[重复]
【发布时间】:2016-08-18 07:43:46
【问题描述】:

我有以下情况:

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_b.hpp 包含在class_a.cpp 中。

【问题讨论】:

    标签: c++ c++11 include declaration forward-declaration


    【解决方案1】:

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

    【讨论】:

    • 傻我..这应该是显而易见的。非常感谢
    • @HumamHelfawi 如果这是您问题的答案,您应该接受。
    • @PeterK 是的,当然:) 它需要时间才能被允许接受它
    【解决方案2】:

    为什么我不能只使用前向声明而不包括它?

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

    以下任何一种情况都需要类T 是完整的:

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

    (一般情况下T的大小和布局必须知道。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-25
      • 1970-01-01
      • 2015-02-03
      • 2013-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多