C++程序设计的技巧-Pimple的使用
1.Pimpl概念
在进行项目开发中可能遇到的问题,程序编译耗时很长,每一次简单修改接口之后项目都会被完全重新编译,浪费了很多时间。这个机制是Private Implementation的缩写,顾明思议,将实现私有化,力图使得头文件对改变不透明.它的优点很多,诸如降低编译依赖、提高重编译速度之类的工具性优势、同时保持接口的稳定性。
2.Pimpl机制
Pimpl惯用法的基本思想是使用一个结构将原有接口class的私有数据成员和一些不希望被外界调用的对数据成员操作的过程封装起来,此时class的私用成员的结构看起来是:
private:
struct Member;
Member* data_member;
将这个Member的结构实现放在cpp文件中,类的私有成员中只能看到Member结构的前向声明以及一个该结构的指针。
这样就将一些我们不期望被用户调用的过程封装起来,可以防止资源泄露。同时类与数据成员之间的耦合最低,类看起来总是一个样子,包含该类声明的文件也不会因为类实现的改变而重新编译,节约了编译时间.
原有类:
class Person{
public:
Person(void);
~Person();
private:
string name;
size_t age;
string from;
string work;
};
Pimpl惯用法修改后:
class Person{
public:
Person(void);
~Person();
private:
struct Member;
Member* data_member;
}
Member相关实现在另一个cpp文件中,很明显,修改后Person类与数据成员的耦合度大大降低,用户对其他细节也变得不可见了。
例子:
在Pimpl机制中,我们使用前置声明一个impl类,并将这个类的一个指针实例放入主类中,如下:
//MyClass.h
class MyClassImpl; //forward declaration
class MyClass{
public:
MyClass();
~MyClass();
int foo(); private:
MyClassImpl * m_pImpl;
};
现在,除非我们修改MyClass的公有接口,否则这个头文件是不会被修改了。然后,我们用这个Impl类的实现来完成主类的细节实现,在主类的构造函数中,我们完成了实现类指针的实例化:
//MyClass.cpp
class MyClassImpl{
public:
int foo(){return bar();} int bar(){return var++;}
int var;
}; MyClass::MyClass:m_Impl(new MyClassImpl){}
MyClass::~MyClass(){
try{
delete m_pImpl;
}
catch(...){}
} int MyClass::foo(){return m_pImpl->foo();}
Pimpl机制其实是桥接模式的一种变类。我们可以对实现类随意的进行增删和修改,而不会导致包含MyClass的源代码重新编译。当然,这样做的时间开销和空间开销也是有的。
C++程序设计的技巧-Pimple的使用的更多相关文章
- 《程序设计方法》【PDF】下载
内容简介 <程序设计方法>主要以方法为主导,结合C语言,把程序设计方法学研究中若干成熟的理论和方法用通俗易懂的语言描述出来.<程序设计方法>还选取趣味性强.技巧性高.能够启发学 ...
- C++学习书籍推荐《C++程序设计原理与实践》下载
百度云及其他网盘下载地址:点我 编辑推荐 <C++程序设计原理与实践>是经典程序设计思想与C++开发实践的完美结合,是C++之父回归校园后对C++编程原理和技巧的全新阐述.书中全面地介绍了 ...
- 数据结构(DataStructure)与算法(Algorithm)、STL应用
catalogue . 引论 . 数据结构的概念 . 逻辑结构实例 2.1 堆栈 2.2 队列 2.3 树形结构 二叉树 . 物理结构实例 3.1 链表 单向线性链表 单向循环链表 双向线性链表 双向 ...
- 推荐:Java性能优化系列集锦
Java性能问题一直困扰着广大程序员,由于平台复杂性,要定位问题,找出其根源确实很难.随着10多年Java平台的改进以及新出现的多核多处理器,Java软件的性能和扩展性已经今非昔比了.现代JVM持续演 ...
- OO第四单元&课程总结
一.本单元架构设计 第一次作业 本次作业要求解析UML类图. 首先,将UML中的各个元素(比如UmlClass.UmlInterface等)转化成自己定义的类(MyClass.MyInterface) ...
- 读javascript高级程序设计16-几条函数小技巧
内容概要 作用域安全的构造函数 惰性载入函数 函数绑定 函数节流 一.作用域安全的构造函数 我们知道,当使用new操作符调用构造函数时,构造函数内部的this会指向新创建对象的实例. function ...
- HTML5 程序设计 - 使用HTML5 Canvas API
请你跟着本篇示例代码实现每个示例,30分钟后,你会高喊:“HTML5 Canvas?!在哥面前,那都不是事儿!” 呵呵.不要被滚动条吓到,很多都是代码和图片.我没有分开写,不过上面给大家提供了目录,方 ...
- 搜索技巧<转>
平时工作,搜索引擎是少不了的,作为程序员,当然首推 Google.这里简单介绍下几个 Google 搜索的小技巧,方便别人也方便自己查阅. ps:以下所有操作,均可以在 「谷歌搜索首页 -> 设 ...
- 【实战Java高并发程序设计6】挑战无锁算法:无锁的Vector实现
[实战Java高并发程序设计 1]Java中的指针:Unsafe类 [实战Java高并发程序设计 2]无锁的对象引用:AtomicReference [实战Java高并发程序设计 3]带有时间戳的对象 ...
随机推荐
- DedeCMS标签 PHP判断语句写法
缩略图标签的判断写法,如果有图片就显示,没图片就显示别的. {dede:field name=litpic runphp='yes'} if(!empty(@me)) { @me="< ...
- 如何解决mysql数据库8小时无连接自动关闭
windows下打开my.ini,增加: interactive_timeout=28800000 wait_timeout=28800000 专家解答:MySQL是一个小型关系型数据库管理系统,由于 ...
- 字符串匹配算法之Sunday算法
字符串匹配查找算法中,最着名的两个是KMP算法(Knuth-Morris-Pratt)和BM算法(Boyer-Moore).两个算法在最坏情况下均具有线性的查找时间.但是在实用上,KMP算法并不比最简 ...
- 按钮控件Button
钮窗口(控件)在MFC中使用CButton表示,CButton包含了三种样式的按钮,Push Button,Check Box,Radio Box.所以在利用CButton对象生成按钮窗口时需要指明按 ...
- 性能测试工具--SIEGE安装及使用简介
官方网站http://www.joedog.org/ 概述 Siege是一个多线程http负载测试和基准测试工具.它有3种操作模式: 1) Regression (when invoked by bo ...
- express源码剖析--Router模块
1.加载模块执行代码: methods.forEach(function(method){ //method是http协议的各种请求方法,如:get,put,headee,post Route.pro ...
- Storm测试报告
http://blog.csdn.net/jmppok/article/details/17614431
- Altium Designer同一个工程里不同原理图导入到不同的PCB
问题: 在用Altium Designer进行PCB工程设计时,有时一个工程里可能不止一块PCB,比如,一个设备里有主板和扩展板或者按键板等等,这时就需要在一个工程里添加多个PCB文件.如图: 我们知 ...
- head,tail,cat,more,less
tail FILE -n 4,查看文件最后4行内容head FILE -n 10,查看文件最前4行内容 使用cat more less都可以查看文本内容,但是它们三者有什么区别呢?more和less的 ...
- 2015第29周六Spring
搜了一下Spring相关的经典书籍: <Spring实战(第3版)>从核心的Spring.Spring应用程序的核心组件.Spring集成3个方面,由浅入深.由易到难地对Spring展开了 ...