1.Pimpl概念

在进行项目开发中可能遇到的问题,程序编译耗时很长,每一次简单修改接口之后项目都会被完全重新编译,浪费了很多时间。这个机制是Private Implementation的缩写,顾明思议,将实现私有化,力图使得头文件对改变不透明.它的优点很多,诸如降低编译依赖、提高重编译速度之类的工具性优势、同时保持接口的稳定性。

2.Pimpl机制

Pimpl惯用法的基本思想是使用一个结构将原有接口class的私有数据成员和一些不希望被外界调用的对数据成员操作的过程封装起来,此时class的私用成员的结构看起来是:

private:

struct Member;

Member* data_member;

将这个Member的结构实现放在cpp文件中,类的私有成员中只能看到Member结构的前向声明以及一个该结构的指针。

这样就将一些我们不期望被用户调用的过程封装起来,可以防止资源泄露。同时类与数据成员之间的耦合最低,类看起来总是一个样子,包含该类声明的文件也不会因为类实现的改变而重新编译,节约了编译时间.

原有类:

 1 class Person{
 2 public:
 3    Person(void);
 4    ~Person();
 5
 6 private:
 7    string name;
 8    size_t age;
 9    string from;
10    string work;
11 };

Pimpl惯用法修改后:

1 class Person{
2 public:
3     Person(void);
4     ~Person();
5 private:
6    struct Member;
7    Member* data_member;
8 }

Member相关实现在另一个cpp文件中,很明显,修改后Person类与数据成员的耦合度大大降低,用户对其他细节也变得不可见了。

例子:

在Pimpl机制中,我们使用前置声明一个impl类,并将这个类的一个指针实例放入主类中,如下:

//MyClass.h
class MyClassImpl;  //forward declaration
class MyClass{
public:MyClass();~MyClass();int foo();private:MyClassImpl * m_pImpl;
};

现在,除非我们修改MyClass的公有接口,否则这个头文件是不会被修改了。然后,我们用这个Impl类的实现来完成主类的细节实现,在主类的构造函数中,我们完成了实现类指针的实例化:

 1 //MyClass.cpp
 2 class MyClassImpl{
 3 public:
 4     int foo(){return bar();}
 5
 6     int bar(){return var++;}
 7     int var;
 8 };
 9
10 MyClass::MyClass:m_Impl(new MyClassImpl){}
11 MyClass::~MyClass(){
12     try{
13         delete m_pImpl;
14     }
15     catch(...){}
16 }
17
18 int MyClass::foo(){return m_pImpl->foo();}

Pimpl机制其实是桥接模式的一种变类。我们可以对实现类随意的进行增删和修改,而不会导致包含MyClass的源代码重新编译。当然,这样做的时间开销和空间开销也是有的。

转载于:https://www.cnblogs.com/sixue/p/4293418.html

C++程序设计的技巧-Pimple的使用相关推荐

  1. 国家二级c语言程序设计技巧,国家二级C语言机考程序设计题技巧.doc

    计算机国家二级C机考程序设计题技巧 双击桌面上的,启动计算机等级考试二级模拟软件:启动软件后出现如下界面,选择练习模式后确定: 之后出现下面窗口,选择一套题,我们提供的模拟软件中共提供了50套模拟题目 ...

  2. c语言编程建议和技巧,C语言程序设计学习技巧

    C语言程序设计学习技巧 [C语言程序设计上机练习技巧] 1.学习编程的秘诀是:编程,编程,再编程! 要多上机.进系统练习,不能停留在所谓的复印答案上.不看书是绝对不行的,但光看不练也不行,练习能加深对 ...

  3. 程序设计课程技巧小总结

    一.while(scanf("%d %d",&a,&b)!=EOF) EOF是文件结束流  这个一般在ACM比赛中要求输入数据有多组时这么做 while (scan ...

  4. c语言循环结构程序设计视频,第13讲:循环结构程序设计1

    C语言是计算机科学及应用专业的一门重要的专业基础 课,也是全校各 个专业的公共必修课程.它既可以为其它专业课程奠定程序设计的基础,又可以作为其它专业课程的程序设计的工具. 通过本课程的学习,应掌握计算 ...

  5. 二十八条改善ASP性能和外观的技巧(三)

    变量 Foo 被解析为全局对象. 变量 bar 被解析为 Foo 的成员.这实际就是一次 COM 方法调用. 变量 blah 被解析为 Foo.bar 的成员.这又是一次 COM 方法调用. 变量 q ...

  6. 优化 ASP 应用程序和 VBScript 的技巧。

    摘要:本文介绍优化 ASP 应用程序和 VBScript 的技巧. 目录 技巧 1:将经常使用的数据缓存在 Web 服务器上 技巧 2:将经常使用的数据缓存在 Application 或 Sessio ...

  7. 二十八条改善 ASP 性能和外观的技巧

    摘要:本文介绍优化 ASP 应用程序和 VBScript 的技巧. 目录 技巧 1:将经常使用的数据缓存在 Web 服务器上 技巧 2:将经常使用的数据缓存在 Application 或 Sessio ...

  8. C++学习书籍推荐《C++程序设计原理与实践》下载

    百度云及其他网盘下载地址:点我 编辑推荐 <C++程序设计原理与实践>是经典程序设计思想与C++开发实践的完美结合,是C++之父回归校园后对C++编程原理和技巧的全新阐述.书中全面地介绍了 ...

  9. 微软的100道算法面试题(一)

    程序员为什么要学数据结构? 在计算机发展的初期,人们使用计算机的主要目的是处理数值计算问题.使用计算机解决具体问题一般需要经过以下几个步骤:首先从具体问题抽象出适当的数学模型,然后设计或选择解此数学模 ...

  10. 推荐:Java性能优化系列集锦

    Java性能问题一直困扰着广大程序员,由于平台复杂性,要定位问题,找出其根源确实很难.随着10多年Java平台的改进以及新出现的多核多处理器,Java软件的性能和扩展性已经今非昔比了.现代JVM持续演 ...

最新文章

  1. 【swjtu】数据结构实验3_基于循环队列的排队买票模拟程序
  2. python中json.dump() 和 json.dumps() 有那些区别?
  3. 【每日SQL打卡】​​​​​​​​​​​​​​​DAY 23丨学生们参加各科测试的次数【难度简单】​
  4. pythonos模块使用技巧大全_Python os模块常用部分功能总结
  5. python 组合优化 回撤最小_【策略回测】多因子搭配组合优化(内附bonus)
  6. 华为笔记本没有网线口_3599元起,华为台式机MateStation B515上架:R5 4600G
  7. c语言办公用品管理系统,恒达办公用品管理系统
  8. 英国essay与澳洲essay写作区别以及注意事项
  9. html注册页面连接mysql_注册界面连接数据库
  10. 六度好友算法【转载】
  11. 2021-02-24 bat 批处理教程
  12. django实现qq一键登录(qq互联)
  13. 2022年测试工程师高频面试题及答案【python篇】
  14. waterMark相关
  15. 实现八大行星绕太阳3D旋转效果,这波操作不来喊个666?
  16. pandas 向已有的excel指定的行和列添加数据
  17. 德州扑克实践之二------判断牌型
  18. HEVC (H.265)介绍(转)
  19. 资源 | 斯坦福大学Tensorflow深度学习课程表
  20. 2018年新版超音速启动

热门文章

  1. 量化研究-恐慌和贪婪指数
  2. Neyman-Pearson 奈曼-皮尔逊决策分析
  3. HTML期末作业-我的家乡网页作业
  4. 数据挖掘——无量纲化
  5. 技术交流:对于大流量的网站,如何解决访问量的问题
  6. java计算机毕业设计共享充电宝管理系统演示录像2021源码+mysql数据库+系统+lw文档+部署
  7. uni-app背景图片的设置
  8. 算法成华纳旗下歌手?背景音乐经济
  9. Entity Framework基础
  10. 做好大型项目的五个关键