c++ - 将 shared_ptr 保存到类中的实现的设计模式和优点是什么?
问题描述
如:
//Foo.cpp
class Foo{
private:
std::shared_ptr<FooImpl> impl_;
}
//FooImpl.cpp
class FooImpl{
//in this class, major implementations of Foo's details are in here.
}
上面是例子。FooImpl
给出内存分配、实例变量定义等。Foo
仅将private
shared_ptr 保存到FooImpl
.
解决方案
设计模式是“The pimpl idiom ”(它的名字是通过将指针缩写为实现)。
设计模式包括将类的实现(“实现”)放在 .cpp 文件中,并在头文件中仅保留该类的接口/入口点的定义(您的“Foo”外部类在您的例子)。
一些优点:
实现类的依赖项不需要包含在声明 Foo 类的标头中。这可以加快编译速度并避免导入您想要避免覆盖整个代码库的库。
FooImpl 的多态特性被保留。客户端代码仅适用于 Foo 的接口,但您可以隐藏多个实现,方法是通过继承专门化 FooImpl,并使用派生类实例化指针。
ABI 保持稳定。如果您的 FooImpl 有一个模板化的 API(或一个经常更改的 API),对 FooImpl 的 API 进行任何更改都会触发包含 Foo 头文件的所有代码的重建。这是一项(取决于您的代码库)可能需要几分钟或几小时的操作。通过将 FooImpl 的定义隐藏在 Foo.cpp 中,当你修改 FooImpl 的 API 时,构建修改后的代码只需要重新编译 Foo.cpp 并重新链接所有内容。
推荐阅读
- python - Keras 在训练 RNN 时误解了数据的形状
- bash - 在bash脚本中将数字转换为格式分:秒.hundreths?
- c# - 抽象类和多态 - 通常如何处理附加方法和属性?
- mongodb - 如何在聚合命令期间跳过前 n 个批处理文档?
- java - 在双调数组中搜索变成无限循环
- powershell - 带有字符串数组的powershell函数开关参数
- javascript - 将具有完整时区名称的日期转换为 JavaScript 中的日期
- python - Django Python 将数据库博客文章保存到 zip 文件?
- php - 在带有左连接的查询中使用计数
- list - 用语义等效的猫功能替换 scalaz ListT