C++ C++;包含vs向前声明策略

C++ C++;包含vs向前声明策略,c++,class,include,forward-declaration,C++,Class,Include,Forward Declaration,考虑C++中两条众所周知的经验法则: 尽可能使用自动对象以从RAII中获益 尽可能使用前向声明而不是实际包含,以减少编译时间和依赖项的数量 假设我有以下C++类: class D { // some methods A a; B b; C c; }; 按照第一条经验法则,我应该保留所有三个自动对象,并添加包括: #include <A.h> #include <B.h> #include <C.h> class D { // some met

考虑C++中两条众所周知的经验法则:

  • 尽可能使用自动对象以从RAII中获益
  • 尽可能使用前向声明而不是实际包含,以减少编译时间和依赖项的数量
假设我有以下C++类:

class D {
  // some methods
  A a; B b; C c;
};
按照第一条经验法则,我应该保留所有三个自动对象,并添加包括:

#include <A.h>
#include <B.h>
#include <C.h>
class D {
  // some methods
  A a; B b; C c;
};
但在这种情况下,我必须自己管理对象的创建/删除,我们知道这通常会导致错误和内存泄漏


这个问题有解决办法吗?如果可能的话,使用私有实现类是我希望避免的一种痛苦。

(我假设您严格地说的是
d
拥有子对象实例的情况)这似乎是主观的,因此,一个基于观点的答案是:使用自动对象,如果相应的头太大,编译时间明显变长,请修复该问题。

您可以使用std::unique\u ptr a;诸如此类。您不应该仅仅根据include/forward声明的便利性来决定如何存储成员变量。实际上,你应该考虑如果你的类应该拥有这些成员,或者简单地指向/引用它们,你可以使用UnQuyQPTR来避免内存管理。boost提供了这个接口。类似于java中的垃圾收集器。unique_ptr在不再被引用时将销毁自身。好吧,我不知道stl托管指针不需要完整的类声明。非常感谢。你应该拼得更好。您的示例无法编译。;-)
class A; class B; class C;
class D {
  // some methods
  A *a; B *b; C *c;
};