C ++包含与前向声明策略[关闭]

Posted

技术标签:

【中文标题】C ++包含与前向声明策略[关闭]【英文标题】:C++ include vs forward declaration strategy [closed] 【发布时间】:2015-07-13 17:51:16 【问题描述】:

考虑一下 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.h 时,很多额外的标头进入范围

遵循第二条规则,我应该执行以下操作:

class A; class B; class C;
class D 
  // some methods
  A *a; B *b; C *c;
;

但在这种情况下,我必须自己管理对象的创建/删除,我们知道这通常会导致错误和内存泄漏。

这个问题有解决方案吗?如果可能的话,我希望避免使用私有实现类。

【问题讨论】:

你可以使用 std::unique_ptr a;等等。 您不应该仅仅根据包含/转发声明的便利性来决定如何存储成员变量。您实际上应该考虑您的班级是否应该拥有这些成员,或者只是指向/引用它们。 您可以使用 Unique_ptr 来避免自我内存管理。 boost 给出了这个接口。类似于java中的垃圾收集器。 unique_ptr 将在不再被引用时自行销毁。 好吧,我不知道 stl 托管指针不需要完整的类声明。谢谢! 你应该拼写得更好。您的示例无法编译。 ;-) 【参考方案1】:

(我假设您是在严格谈论 D 拥有子对象实例的情况)这似乎是主观的,所以有点基于意见的答案:使用自动对象,如果相应的标头太大以至于编译时间明显变长,修复那个问题。

【讨论】:

以上是关于C ++包含与前向声明策略[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

C:外部变量声明并包含守卫[关闭]

如何在 IAM 角色的信任策略中检查自定义 OpenID 声明?

C#如何在签入策略期间获取挂起更改的程序集

设计模式策略模式责任链以及装饰器之间的区别

基于 普通及Lambda方式实现策略模式

术语:前向声明与函数原型