gpt4 book ai didi

c++ - 是否应该使用指针来减少 header 依赖性?

转载 作者:太空宇宙 更新时间:2023-11-04 16:05:43 26 4
gpt4 key购买 nike

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

例如,下面使用值。

// 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 调用,我想这会很慢。

最佳答案

这就是大多数人所说的 Pimpl 习语 (http://c2.com/cgi/wiki?PimplIdiom)。

简单回答

我高度怀疑您对此没有很好的用例,应该不惜一切代价避免它。

我的经验

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

示例

如果您想向在后台使用某些 boost 库代码的人提供 SDK,但您希望选择稍后将其换成其他库而不给消费者带来任何问题SDK,那么 Pimpl 就很有意义。

它还有助于在实现上创建一个外观,以便可以控制整个公开的公共(public)接口(interface),而不是公开您隐式依赖的库,以及您不公开的整个接口(interface)。无法控制,可能会改变,可能暴露太多,可能难以使用等。

关于c++ - 是否应该使用指针来减少 header 依赖性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36000665/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com