应该使用指针来减少标头依赖性吗?

时间:2016-03-15 00:33:18

标签: c++ pointers circular-dependency forward-declaration

在创建由其他类组成的类时,是否值得通过使用指针而不是值来减少依赖性(以及编译时间)?

例如,以下使用值。

// ThingId.hpp
class ThingId
{
    // ...
};

// Thing.hpp
#include "ThingId.hpp"
class Thing
{
public:
    Thing(const ThingId& thingId);
private:
    ThingId thingId_;
};

// Thing.cpp
#include "Thing.hpp"
Thing::Thing(const ThingId& thingId) :
    thingId_(thingId) {}

但是,下面的修改版本使用指针。

// ThingId.hpp
class ThingId
{
    // ...
};

// Thing.hpp
class ThingId;
class Thing
{
public:
    Thing(const ThingId& thingId);
private:
    ThingId* thingId_;
};

// Thing.cpp
#include "ThingId.hpp"
#include "Thing.hpp"
Thing::Thing(const ThingId& thingId) :
    thingId_(new ThingId(thingId)) {}

我已经阅读了推荐这种方法的帖子,但是如果你有大量的指针,那么就会有大量的new来电,我想这会很慢

2 个答案:

答案 0 :(得分:3)

大多数人称之为Pimpl习语(http://c2.com/cgi/wiki?PimplIdiom)。

简单回答

我非常怀疑你没有一个好的用例,应该不惜一切代价避免它。

我的经历

Pimpl对我有用的主要方式是将实现细节设为私有。它实现了这一点,因为您不需要包含依赖项的标头,但可以简单地转发声明它们的类型。

示例

如果您想向使用某些升级库代码的人提供SDK,但您希望以后选择将其替换为其他库而不会导致消费者出现任何问题你的SDK,然后Pimpl可以很有意义。

它还有助于在实现上创建一个外观,以便可以控制整个公开的公共接口,而不是暴露你隐含依赖的库,从而暴露你所依赖的整个界面t有控制可能会改变,可能暴露太多,可能难以使用等。

答案 1 :(得分:2)

如果您的程序不保证动态分配,请不要仅仅为了项目组织而引入它。那肯定是一个虚假的经济。

您真正想要做的是尝试完全减少类间依赖的数量。

然而,只要你的耦合是合理的和树状的,不要太担心它。如果你正在使用预编译的头文件(你是,对吧?)那么这对编译时间来说都不重要。