核心思想
Pimpl
模式的主要目标是分离接口与实现,通过将类的实现细节封装在私有的实现类中,减少编译依赖并提高二进制兼容性。
示例代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| class my_class { private: class impl; std::unique_ptr<impl> pimpl; };
class my_class::impl { };
my_class::my_class() : pimpl(new impl) { }
|
优点
- 减少编译依赖
- 客户端只依赖类的接口(头文件),实现细节变化无需重新编译。
- 分离接口和实现
- 将类的私有数据和方法封装在
impl 中,接口保持不变。
- 提高可移植性和二进制兼容性
- 隐藏实现细节
Pimpl vs 虚函数接口
| 二进制兼容性 |
修改虚函数表会破坏兼容性 |
修改 impl 不影响接口和客户端 |
| 封装性 |
公开继承,接口暴露实现 |
完全隐藏实现细节 |
| 编译依赖 |
接口和实现耦合,修改需要重新编译 |
客户端仅依赖头文件,不依赖实现 |
总结
- Pimpl 模式是一种经典的 信息隐藏与接口分离 技术
- 适合库开发或需要保持二进制兼容性的场景
- 结合智能指针(如
unique_ptr)可安全管理资源