C++ 包含 vs 前向声明策略
C++ include vs forward declaration strategy
考虑 C++ 中的两个 well-known 经验法则:
- 尽可能使用自动 objects 以受益于 RAII
- 尽可能使用前向声明而不是实际包含,以减少编译时间和依赖项数量
假设我在 C++ 中有以下 class:
class D {
// some methods
A a; B b; C c;
};
根据第一条经验法则,我应该保持所有三个自动 objects 并添加包括:
#include <A.h>
#include <B.h>
#include <C.h>
class D {
// some methods
A a; B b; C c;
};
因此我增加了编译时间,因为当我包含 D.h
时,很多额外的 headers 进入范围
根据第二条规则,我应该执行以下操作:
class A; class B; class C;
class D {
// some methods
A *a; B *b; C *c;
};
但在这种情况下,我必须自己管理 creation/deletion 个 objects,我们知道这经常会导致错误和内存泄漏。
这个问题有解决办法吗?如果可能的话,我想避免使用私有实现 classes 是一种痛苦。
(我假设你是在严格谈论 D
拥有 child object 个实例的情况)这似乎是主观的,所以有点 opinion-based 答案: 使用自动 objects 并且如果相应的 headers 太大以至于编译时间明显变长,修复 that 问题。
考虑 C++ 中的两个 well-known 经验法则:
- 尽可能使用自动 objects 以受益于 RAII
- 尽可能使用前向声明而不是实际包含,以减少编译时间和依赖项数量
假设我在 C++ 中有以下 class:
class D {
// some methods
A a; B b; C c;
};
根据第一条经验法则,我应该保持所有三个自动 objects 并添加包括:
#include <A.h>
#include <B.h>
#include <C.h>
class D {
// some methods
A a; B b; C c;
};
因此我增加了编译时间,因为当我包含 D.h
根据第二条规则,我应该执行以下操作:
class A; class B; class C;
class D {
// some methods
A *a; B *b; C *c;
};
但在这种情况下,我必须自己管理 creation/deletion 个 objects,我们知道这经常会导致错误和内存泄漏。
这个问题有解决办法吗?如果可能的话,我想避免使用私有实现 classes 是一种痛苦。
(我假设你是在严格谈论 D
拥有 child object 个实例的情况)这似乎是主观的,所以有点 opinion-based 答案: 使用自动 objects 并且如果相应的 headers 太大以至于编译时间明显变长,修复 that 问题。