c++ pimpl惯用法

本文介绍了C++中的Pimpl编程模式,通过将实现细节封装到单独的类(通常是私有且非虚的),并通过智能指针(如std::unique_ptr)间接访问,实现了接口与实现分离、依赖减少、编译优化和库升级的便利性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

介绍

Pimpl(Pointer to implementation) 是一种减少代码依赖和编译时间的C++编程技巧,其基本思想是将一个外部可见类(visible class)的实现细节(一般是所有私有的非虚成员)放在一个单独的实现类(implementation class)中,而在可见类中通过一个私有指针来间接访问该实现类。(如 std::unique_ptr

什么是 Pimpl 惯用法?

Pimpl 是 “Pointer to Implementation” 的缩写,将其打包成头文件和动态库的形式,交给第三方去使用,这个模式可以帮助我们:

  • 将接口和实现分离,实现信息隐藏
  • 减少头文件中的依赖
  • 实现库的平滑升级(实现文件有变动,只需要替换动态库即可)
  • 编译防火墙(只要头文件不变,第三方产品不需要重新进行编译的)
  • 加速编译

基本实现

基本的 Pimpl 实现需要一个前置声明的内部类和一个指向该内部类的指针。在这里,我们使用 std::unique_ptr 来管理这个内部类的实例。

MyClass.h

 #include <memory>
 
 class MyClassImpl; // 前置声明
 
 class MyClass {
 public:
     MyClass();
     ~MyClass();
     void DoSomething();
 
 private:
     std::unique_ptr<MyClassImpl> pimpl;
 };

MyClass.cpp

 #include "MyClass.h"
 
 class MyClassImpl {
 public:
     void DoSomething() {
         // 实现细节
     }
 };
 
 MyClass::MyClass() : pimpl(std::make_unique<MyClassImpl>()) {}
 MyClass::~MyClass() = default;
 
 void MyClass::DoSomething() {
     pimpl->DoSomething();
 }

总结

通过使用 Pimpl 惯用法和智能指针,我们能更有效地隐藏实现细节,提高编译速度,并使代码更易于维护。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@马云

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值