这两种PIMPL方法之间的差异

时间:2015-08-14 08:38:20

标签: 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;
    };
    
  3. 这里有两个问题:

    • 说实话,我不知道为什么第二个有效。我的意思是表达式 struct PimplClass 我只知道来自前向声明而不是一个类。有人可以向我解释一下吗?
    • 使用哪种解决方案?优势在哪里或者是品味问题?

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:2)

您可以在班级范围内进行前瞻性声明。所以第二个例子是绝对正确的。

第二个例子的主要优点是你的PimplClass无法从VisibleClass的任何地方访问,因为它在私有中被声明(正向声明)部分。