PImpl(private implementation) 其主要作用是解开类的使用接口和实现的耦合。pImpl方法是微软的Herb Sutter提出来的,该方法是为了尽量减小接口和实现之间的耦合,以避免接口改动对程序重新编译等带来的影响。简单来说,如果你的大型程序因为复杂的头 文件包含关系,使得你对某头文件的某小改动可能引起的巨大编译时间成本望而生畏,那么你需要用pImpl方法来改善这种处境。

下面看两个代码示例。

1、

#include "classA.h"

class B

{

classA a;

};

2、

class classA;

class B

{

classA* pa;

};

这两个代码都是对classB的声明,可能会在我们工程的classB.h文件中。它们唯一的不同是1直接引用了classA.h头文件,并声明了classA类型的变量a;而2是通过"class classA;"这句进行classA的声明,然后声明了一个classA类型的指针变量pa,很明显,在2的classB.cpp文件中,需要添加#include "classA.h"。

我们来看看1会发生什么事情。如果你的classB.h文件又被其他头文件classC.h引用,而classC.h又被classD.h文件引用,当你 的工程足够复杂,你的头文件之间的引用可能会非常杂乱,问题会随之出现,比如重复引用(幸好我们有#ifdef和#pragma once等方法帮我们解决问题),比如交叉引用(a引用b,b引用a,头疼),还有可能引用一些本不需要的头文件。如果你觉得这些问题都可以忽略,那么当 你需要改动classA的声明时,不能忽略的问题来了,所有引用该文件的cpp文件都需要重新编译,对于大型工程,这个编译时间成本有时是不能忽略的。你 总不能每改动一次classA,就把几乎大部分代码重新编译一次吧,对于开发和调试来说,这几乎不能忍受。

在1中,classA a语句必须要求引用classA的声明,以便给a变量分配空间;而2中的classA* pa语句则不需要知道classA的具体声明,因为任何指针所占用的空间都是一定的。这样,classB与classA之间就没有了耦合,classA的 任何改动,对于classB来说都没有影响,除非classB修改了对classA调用的代码。在这里,指针起到了解耦合的作用。

pImpl方法是应该被提倡应用的,如果运用的恰当,对于工程开发、维护和编译都能起到正面作用,对于这种编码习惯,是需要我们在平时就注意培养的。

C++开发中的pImpl方法相关推荐

  1. iOS开发中常用的方法

    iOS开发中常用的方法 系统弹窗: 过期方法: UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:@"确认报价" ...

  2. 编写高质量代码:改善Java程序的151个建议 (第1章 Java开发中通用的方法和准则)

    第1章 Java开发中通用的方法和准则 The reasonable man adapts himself to the world;the unreasonable one persists in ...

  3. 编写高质量代码:改善Java程序的151个建议(第1章:JAVA开发中通用的方法和准则___建议1~5)...

                 The reasonable man adapts himself to the world; The unreasonable one persists in trying ...

  4. 01-第一章 Java开发中通用的方法和准则

    建议1:不用在常量和变量中出现易混淆的字母 包括名全小写,类名首字母全大写,常量全部大写并用下划线分割,变量采用驼峰命名法(Camel Case)命名等. 例如: package com.compan ...

  5. 转载----编写高质量代码:改善Java程序的151个建议(第1章:JAVA开发中通用的方法和准则___建议1~5)...

    阅读目录 建议1:不要在常量和变量中出现易混淆的字母 建议2:莫让常量蜕变成变量 建议3:三元操作符的类型务必一致 建议4:避免带有变长参数的方法重载 建议5:别让null值和空值威胁到变长方法    ...

  6. java代码优化的方法和准则_编写高质量代码:改善Java程序的151个建议(第1章:JAVA开发中通用的方法和准则___建议16~20)...

    建议16:易变业务使用脚本语言编写 Java世界一直在遭受着异种语言的入侵,比如PHP,Ruby,Groovy.Javascript等,这些入侵者都有一个共同特征:全是同一类语言-----脚本语言,它 ...

  7. C#在WinForm开发中Label换行方法

    很多朋友都会在开发WinForm中遇到Label要显示的内容太长,但却不能换行的问题.这里我总结了几种方法,供大家参考. 第一种是把Label的AutoSize属性设为False,手动修改Label的 ...

  8. 安卓开发中Bundle使用方法:

    最近工作中涉及很多跟合作伙伴做SDK集成的事情,因为我本身负责产品管理和市场沟通,只懂看一些商务层面和更大框架的东西:之前遇到这种集成的事情都是交给开发的同学去处理就好了,最近发现开发的同学干活有些漂 ...

  9. 转载--编写高质量代码:改善Java程序的151个建议(第1章:JAVA开发中通用的方法和准则___建议16~20)...

    阅读目录 建议16:易变业务使用脚本语言编写 建议17:慎用动态编译 建议18:避免instanceof非预期结果 建议19:断言绝对不是鸡肋 建议20:不要只替换一个类 回到顶部 建议16:易变业务 ...

最新文章

  1. 破解微软xp黑屏方法
  2. 【机器学习】集成模型方法
  3. java多线程中几个常用的方法
  4. java中负数取整_Java取整,固定保留两位小数,适配负数、金融数字。
  5. 线段树初见——区间询问与改变最大值
  6. 【牛客 - 157E】青蛙(floyd最短路,建图)
  7. python3编程入门先学什么_自学编程入门,先学什么语言好?
  8. 微软获 OpenAI 独家 GPT-3 模型授权,为何马斯克炮轰?
  9. 如何查看系统启动时间-转
  10. 分析Linux 0.11中的kernel部分的makefile文件
  11. ansible软件模块参数
  12. 『计算机视觉』Mask-RCNN_锚框生成
  13. “两地三中心”和“双活”简介--容灾技术方案
  14. java 求矩阵的伴随矩阵_求矩阵伴随矩阵的java实现
  15. 轻轻松松做出绝美词云!这是比阿里云DataV还好用的数据可视化平台
  16. Jsonp跨域原理及实现
  17. devops实践指南_最终的DevOps招聘指南
  18. Android花样Text设置神器之SpanableString
  19. php halt,thinkphp-调试halt
  20. Java 下载多个文件打成zip压缩包

热门文章

  1. SpringBoot异常处理-SimpleMappingExceptionResolver
  2. break和continue-continue代码演练
  3. 【Spring MVC】 maven pom.xml 错误: Cannot upgrade/downgrade to Dynamic Web Module 3.0 facet.
  4. 窗体间传值和窗体间互操作
  5. vue打包后图片路径错误
  6. CentOS配置Tair
  7. iometer-2006_07_27.common-src编译
  8. 为什么很多招聘信息都要求三年以上的工作经验?
  9. finally块的问题(finally block does not complete normally) (转)
  10. 沟通CTBS助六和集团实现财务集中管理