c++ - 这两种 PIMPL 方法之间的差异

标签 c++ pimpl-idiom

因此,在尝试接触 PIMPL 习语时,我们发现了两种常见的做法:

  1. 在类外使用前向声明:

    class PimplClass;
    class VisibleClass
    {
    private:
        PimplClass* d_ptr;
    };
    
  2. 在类中使用前向声明:

    // *.hpp
    class VisibleClass
    {
    private:
       struct PimplClass;
       PimplClass* d_ptr;       
    };
    // *.cpp file:
    struct VisibleClass::PimplClass
    {
      int x;
    };
    

这里有两个问题:

  • 老实说,我不知道为什么第二个会起作用。我的意思是表达式 struct PimplClass 我只从前向声明中知道,而不是在类中。有人可以向我解释一下吗?
  • 使用哪种解决方案?优点在哪里还是只是品味问题?

最佳答案

  • 这也是一个前向声明,但是 PimplClass 的范围在 VisibleClass 内。

  • 第二种解决方案的优点是不会将内部类型转储到全局命名空间中。将 PimplClass 限制在 VisibleClass 范围内是完全合理的。

在这两种情况下,Pimpl 习惯用法通常应使用 std::unique_ptr 将接口(interface)和 Impl 的生命周期联系在一起,而不是使用原始拥有指针。

关于c++ - 这两种 PIMPL 方法之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32005777/

相关文章:

C++ - 如何在 Credential Provider V1 (Vista-Win7) 中管理其他用户

c++ - 使用 CURL 进行 GET 请求

c++ - 多个 DLL 的问题

c++ - 减少多虚拟继承中对象的大小(浪费)

C++ pimpl idiom : Implementation depending on a template parameter 收藏

c++ - "unix"C++ 预处理器宏未使用 -std=c++11 定义

c++ - 在头文件中定义所有库是不好的做法吗?

c++ - unique_ptr pimpl 和不完整类型

c++ - 是否有人建议扩展 C++ 语言以消除 pimpl?

c++ - 在 C++ 中隐藏实现细节