因此,当试图与PIMPL
成语取得联系时,我会发现两种常见的方法:
在课堂外使用前向声明:
class PimplClass;
class VisibleClass
{
private:
PimplClass* d_ptr;
};
在课程中使用前向声明:
// *.hpp
class VisibleClass
{
private:
struct PimplClass;
PimplClass* d_ptr;
};
// *.cpp file:
struct VisibleClass::PimplClass
{
int x;
};
这里有两个问题:
答案 0 :(得分:3)
这也是一个前向声明,但PimplClass
的范围是VisibleClass
。
第二种解决方案的优点是不会将内部类型转储到全局命名空间中。保持PimplClass
范围内VisibleClass
完全合理。
在这两种情况下,Pimpl习惯用法通常应使用std::unique_ptr
将接口和Impl的生命周期联系在一起,而不是原始拥有指针。
答案 1 :(得分:2)
您可以在班级范围内进行前瞻性声明。所以第二个例子是绝对正确的。
第二个例子的主要优点是你的PimplClass
无法从VisibleClass
的任何地方访问,因为它在私有中被声明(正向声明)部分。