因此,在尝试接触 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; };
这里有两个问题:
- 老实说,我不知道为什么第二个会起作用。我的意思是表达式 struct PimplClass 我只从前向声明中知道,而不是在类中。有人可以向我解释一下吗?
- 使用哪种解决方案?优点在哪里还是只是品味问题?
最佳答案
这也是一个前向声明,但是
PimplClass
的范围在VisibleClass
内。第二种解决方案的优点是不会将内部类型转储到全局命名空间中。将
PimplClass
限制在VisibleClass
范围内是完全合理的。
在这两种情况下,Pimpl 习惯用法通常应使用 std::unique_ptr
将接口(interface)和 Impl 的生命周期联系在一起,而不是使用原始拥有指针。
关于c++ - 这两种 PIMPL 方法之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32005777/