首页 > 解决方案 > 将 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仅将privateshared_ptr 保存到FooImpl.

标签: c++

解决方案


设计模式是“The pimpl idiom ”(它的名字是通过将指针缩写为实现)。

设计模式包括将类的实现(“实现”)放在 .cpp 文件中,并在头文件中仅保留该类的接口/入口点的定义(您的“Foo”外部类在您的例子)。

一些优点:

  • 实现类的依赖项不需要包含在声明 Foo 类的标头中。这可以加快编译速度并避免导入您想要避免覆盖整个代码库的库。

  • FooImpl 的多态特性被保留。客户端代码仅适用于 Foo 的接口,但您可以隐藏多个实现,方法是通过继承专门化 FooImpl,并使用派生类实例化指针。

  • ABI 保持稳定。如果您的 FooImpl 有一个模板化的 API(或一个经常更改的 API),对 FooImpl 的 API 进行任何更改都会触发包含 Foo 头文件的所有代码的重建。这是一项(取决于您的代码库)可能需要几分钟或几小时的操作。通过将 FooImpl 的定义隐藏在 Foo.cpp 中,当你修改 FooImpl 的 API 时,构建修改后的代码只需要重新编译 Foo.cpp 并重新链接所有内容。


推荐阅读