当前位置: 首页 > news >正文

开发者应该掌握的思想谱系(七)PIMPL

一句话核心

把类的私有成员隐藏到一个内部类里,公开类只保留一个指向内部类的指针。

没有 PIMPL:你把家里的贵重物品、私密日记都放在客厅茶几上。每个来家里的客人都能看到。

有 PIMPL:你把贵重物品锁在一个保险柜里,客厅里只放一个保险柜的钥匙。客人只能看到钥匙,看不到里面的东西。

先看没有 PIMPL 的代码

// widget.h class Widget : public QWidget { private: // 这些私有成员全部暴露在头文件里 QTimer* m_timer; QList<QString> m_data; DatabaseManager m_db; ConfigManager m_config; LogManager m_log; public: Widget(); void doSomething(); };

问题

  1. 任何包含widget.h的文件,都要编译这些私有成员

  2. 修改私有成员(比如加一个变量),所有包含widget.h的文件都要重新编译

  3. 私有成员暴露在头文件里,不够隐藏

有 PIMPL 的写法

第一步:公开类只放一个指针

// widget.h(对外暴露) class Widget : public QWidget { private: class Impl; // 声明内部类 std::unique_ptr<Impl> m_impl; // 只放一个指针 public: Widget(); ~Widget(); void doSomething(); };

第二步:内部类放真正的私有成员

// widget.cpp(不对外暴露) class Widget::Impl { public: // 真正的私有成员都放这里 QTimer* timer; QList<QString> data; DatabaseManager db; ConfigManager config; LogManager log; }; Widget::Widget() : m_impl(std::make_unique<Impl>()) { m_impl->timer = new QTimer(this); m_impl->db.connect(); } Widget::~Widget() = default; void Widget::doSomething() { m_impl->db.save("data"); }

什么时候你会用到 PIMPL?

场景1:你写的类被很多其他类包含

// config_manager.h(被 100 个文件包含) class ConfigManager { private: // 如果这里加了新成员,100 个文件都要重新编译 QString m_filePath; QMap<QString, QString> m_cache; QMutex m_mutex; // ... 还有很多 };

用 PIMPL 后,加新成员只重新编译config_manager.cpp,其他 100 个文件不用动。

场景2:你给别人提供 SDK(动态库)

你想让别人只用你的头文件和 DLL,不想暴露私有成员。PIMPL 是标准做法。

场景3:你的项目编译很慢(超过 1 分钟)

如果修改一个头文件,整个项目要重新编译很久,可以考虑对核心类用 PIMPL。


五、你现在的项目需要 PIMPL 吗?

大概率不需要。

你现在的项目:

  • 你一个人开发

  • 规模不大

  • 编译速度可以接受

不需要为了用而用,PIMPL 会带来额外的复杂度。

总结

问题答案
每个类都要用 PIMPL 吗?❌ 不需要,99% 的类不用
为什么平时看不到?只有大型项目/SDK 才用
你现在的项目需要吗?❌ 大概率不需要
什么时候需要?编译慢、给别人用 SDK、隐藏实现

PIMPL 是一个“高级优化”工具,不是日常必需品。先理解它的思想,等真正需要时再用。

目规模小(< 5万行代码)❌ 不需要
编译速度可以接受(< 30秒)❌ 不需要
只有你一个人开发❌ 不需要
项目很大(> 50万行代码)✅ 需要
编译一次超过 5 分钟✅ 需要
http://www.jsqmd.com/news/617518/

相关文章:

  • Ostrakon-VL终端惊艳效果展示:8-bit UI下实时摄像头扫描流畅性验证
  • GLM-OCR惊艳效果展示:多页PDF自动切分+跨页表格合并+页脚页码过滤
  • 告别PDF处理烦恼!Windows版Poppler一键安装终极指南
  • 终极游戏模组管理器:XXMI启动器完全指南 [特殊字符]
  • Retrieval-based-Voice-Conversion-WebUI:AI语音转换的终极完整指南
  • 武汉擎天仕劳务有限公司:东西湖区靠谱的吊车租赁 起重吊装公司电话 - LYL仔仔
  • S2-Pro模型压缩与加速教程:使用量化技术提升推理速度
  • 科哥cv_unet_image-matting镜像体验:紫蓝渐变界面,美观易用
  • 龙芯k - 走马观碑组MPU驱动移植敖
  • 武商一卡通快速回收指南:省时省力的实用方法 - 团团收购物卡回收
  • 【笔试真题】- 华子-2026.04.08-算法岗
  • 如何让Figma秒变中文界面?终极FigmaCN插件使用指南
  • WarcraftHelper技术解析:让魔兽争霸III在现代系统焕发新生
  • GLM-4v-9b案例分享:真实用户上传图片的问题解答记录
  • Android Studio中文语言包:3分钟告别英文界面,提升开发效率
  • GHelper完全指南:7个技巧掌握华硕笔记本轻量级性能优化
  • 探索高效自动化办公:掌握KeymouseGo鼠标键盘录制工具的智能解决方案
  • 政务、地产、新零售、短剧出海的数据库选型指南 平凯数据库云服务发布 (福州站)
  • 2026年热门会议实时转写工具实测对比,真香款体验甩同行,差距竟然这么大
  • 2026年国产呼吸阀十大品牌权威排名(综合实力排序) - 小艾信息发布
  • **发散创新:基于Python的模型保护机制设计与实践**在人工智能快速发展的今天,模型作为核心资产被广
  • Win10系统任务管理器无法打开
  • 八大网盘直链解析:告别限速困扰的终极免费方案
  • 两天打通自主飞行链路,SU17无人机培训圆满收官
  • 【实战指南】3种架构实现JPEXS FFDec与企业系统的无缝集成
  • 每周四开启“养娃秒杀日”秒杀母婴好物!京东秒杀频道帮宝爸宝妈省心又省钱 - 博客万
  • OpenClaw+Qwen3-14B智能爬虫:动态网页数据抓取方案
  • 可酷实现AI无人直播关键技术突破,推动直播行业迈入智能化新阶段 - 博客湾
  • **发散创新:用Python实现基于规则的动态权限控制系统**在现代软件系统中,权限管理早已不是简单的“用户-角色-资
  • 抗体偶联药物(ADC):三代技术迭代与偶联策略全景解析