pimpl idiom】的更多相关文章

pimpl idiom flyfish 2014-9-30 pimpl是Pointer to implementation的缩写 为什么要使用pimpl 1最小化编译依赖 2接口与实现分离 3可移植 pimpl idiom也被称作Cheshire Cat , Compiler Firewall idiom.,d-pointer 这个技术在设计模式中作为桥接模式(Bridge pattern.)来描写叙述 看MSDN的演示样例 Pimpl header // my_class.h class my…
在读<Effective C++>和项目源代码时,看到pImpl Idiom.它可以用来降低文件间的编译依赖关系,通过把一个Class分成两个Class,一个只提供接口,另一个负责实现该接口,实现接口与实现的分离.这个分离的关键在于“以声明的依赖性”替换“定义的依赖性”,而编译依赖性最小化的本质是:让头文件尽可能的自我满足,万一做不到,则让它与其他文件内的声明式(而非定义式)相依. 引用这里的一些描述:The Pimpl idiom, also known as the compilation…
http://stackoverflow.com/questions/2346163/pimpl-idiom-vs-bridge-design-pattern…
文档下载 上一篇文档,PIMPL(一) 1 如何使用PIMPL 有多种方式实现PIMPL,这里按照<Effective C++>中介绍的方式. 1.1 基本步骤 假设原有Person如下: Person.h struct Person { public: Person(const int _age); void print(); private: int age; }; Person.cc Person::Person(const int _age) : age(_age) {} void P…
1 参考 <effective C++> 条款31:将文件间的编译关系降至最低 PIMPL Idiom: http://c2.com/cgi/wiki?PimplIdiom 2 什么是PIMPL? PIMPL是指pointer to implementation.通过使用指针的方式隐藏对象的实现细节.是实现“将文件间的编译依存关系降至最低”的方法之一.另一个方式是通过接口实现,但其原理一样. PIMPL又称作“编译防火墙”.“笑脸猫技术”,它只在C/C++等编译语言中起作用. 3 为什么要使用…
Yet Another Source Code for LintCode Current Status : 232AC / 289ALL in Language C++, Up to date (2016-02-10) For more problems and solutions, you can see my LintCode repository. I'll keep updating for full summary and better solutions. See cnblogs t…
Item 1: Understand template type deduction. Item 2: Understand auto type deduction. Item 3: Understand decltype. Item 4: Know how to view deduced types. Item 5: Prefer auto to explicit type declarations. Item 6: Use the explicitly typed initializer i…
PCurve - Curve on Surface eryar@163.com Abstract. 本文通过给出曲面上曲线PCurve的定义来对OpenCascade中的Curve On Surface进行理解,并介绍了OpenCascade对应的类BRep_CurveOnSurface实现.通过Tcl脚本输出的球的拓朴信息,分析PCurve的实际应用. Key words. OpenCascade, ACIS, PCurve, Curve on Surface, Parametric Surf…
Callback.h 继承层次 CallBack实现类 基类 第一层子类 第二层子类 第三层子类 SimpleRefCount CallbackImplBase CallbackImpl FunctorCallbackImpl MemPtrCallbackImpl BoundFunctorCallbackImpl TwoBoundFunctorCallbackImpl ThreeBoundFunctorCallbackImpl Callback封装类 CallbackBase 封装Ptr<Cal…
C++11标准推出了很多有用的新特性,本文特别关注那些相比C++98更像是一门新语言的特性,理由是: 这些特性改变了编写C++程序使用的代码风格和习语[译注 1],通常也包括你设计C++函数库的方式.例如,你会看到更多参数和返回值类型为智能指针(smart pointer),同时也会看到函数通过值传递返回大型对象.你将会发现在大多数的代码示例中充斥着新特性的身影.例如,几乎每5行现代C++代码示例都会使用到auto. C++11的其他特性也很棒.但是请先熟悉下面这些,正是由于这些特性的广泛使用使…
引言:编译时间成本 在项目中我们都会碰到修改既存类的情况:某个class实现文件做了些轻微改变,修改的不是接口,而是实现,而且只改private成分. 重新build这个程序,并预计只花数秒就好,当按下“Build”,结果整个世界都被重新编译和链接了! 问题是在c++并没有把“将接口从实现中分离”做得很好.class 的定义式不只详细叙述了class接口,还包括十足的实现细目: 例如: class Person{ public: Person(const std::string& name, c…
转载于stackoverflow:http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list 感谢George Stocker的总结 Reference Style - All Levels A Tour of C++ (Bjarne Stroustrup) The "tour" is a quick (about 180 pages and 14 chapters) tutorial o…
学习c++的书单 转自 http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list Beginner Introductory If you are new to programming or if you have experience in other languages and are new to C++, these books are highly recommended. C++ Pr…
条款26 尽可能延后变量定义式的出现时间(Lazy evaluation) 记住: ★尽可能延后变量定义式的出现.这样做可增加程序的清晰度并改善程序效率 ---------------------------------------------------------------------- 举例说明: std::string encryptPassword( const std::string &password ) { using namespace std; string encrypt…
/****************************************************************/ /*            学习是合作和分享式的! /* Author:Atlas                    Email:wdzxl198@163.com /*  转载请注明本文出处: *   http://blog.csdn.net/wdzxl198/article/details/9112123 /*************************…
1. swap如此重要 Swap是一个非常有趣的函数,最初作为STL的一部分来介绍,它已然变成了异常安全编程的中流砥柱(Item 29),也是在拷贝中应对自我赋值的一种普通机制(Item 11).Swap非常有用,恰当的实现swap是非常重要的,与重要性伴随而来的是一些并发症.在这个条款中,我们将探索这些并发症以及如何处理它们. 2. swap的傻瓜实现方式及缺陷 2.1 swap函数的默认实现 Swap函数就是将两个对象的值进行交换,可以通过使用标准的swap算法来实现: namespace…
此文是如下博文的翻译: https://herbsutter.com/elements-of-modern-c-style/ C++11标准提供了许多有用的新特性.这篇文章特别针对使C++11和C++98相比看上去像一门新语言的特性,因为: C++11改变了书写C++代码的风格和习惯,也改变了设计C++库的方式.例如,你会看到更多的被当作参数和返回值的智能指针,还有按值(by value)返回巨大对象的函数. 它们被使用的非常广泛,在大多数代码中你都能看到它们.举个例子,在现代C++中几乎每5行…
异常安全在某种意义上来说就像怀孕...但是稍微想一想.在没有求婚之前我们不能真正的讨论生殖问题. 假设我们有一个表示GUI菜单的类,这个GUI菜单有背景图片.这个类将被使用在多线程环境中,所以需要mutex进行并发控制. class PrettyMenu { public: ... void changeBackground(std::istream& imgSrc); // change background ... // image private: Mutex mutex; // mute…
1. 牵一发而动全身 现在开始进入你的C++程序,你对你的类实现做了一个很小的改动.注意,不是接口,只是实现:一个私有的stuff.然后你需要rebuild你的程序,计算着这个build应该几秒钟就足够了.毕竟,只修改了一个类.你点击了build 或者输入了make( 或者其他方式),你被惊到了,然后羞愧难当,因为你意识到整个世界都被重新编译和重新链接了!当这些发生时你不觉的感到愤恨么? 2. 编译依赖是如何发生的 问题出在C++并不擅长将接口从实现中分离出来.类定义不仅指定了类的接口也同时指定…
C++必读书籍推荐 (原链接:http://bestcbooks.com/recommended-cpp-books 2013-10-07) 本文内容来自国外著名编程问答网站Stackoverflow评选的C++推荐书单!推荐大家看原版英文,但这些书大部分也都有中文版! 手册类 – 所有级别 C++程序设计语言(The C++ Programming Language) 作者:Bjarne Stroustrup(更新到C++11)C++之父写的经典C++书籍.内容覆盖C++的所有东西,从语言内核…
北京时间2016年1月9日10:31:06.正式開始翻译.水平有限,各位看官若有觉得不妥之处,请批评指正. 之前已经有人翻译了前几个条目,有些借鉴出处:http://www.cnblogs.com/magicsoar/p/3966177.html?utm_source=tuicool&utm_medium=referral 如今就開始<Effective Modern C++>翻译之旅,第一个姿势--简单介绍 Introduction 假设您是一位专家级别的C++project师,和我…
我根据自己的理解,对原文的精华部分进行了提炼,并在一些难以理解的地方加上了自己的"可能比较准确"的「翻译」. Chapter 5 实现 Implementations 适当提出属于你的class定义以及各种functions声明相当花费心思.一旦正确完成它们,相应的实现大多直截了当.尽管如此,还是要小心很多细节. 条款26 : 尽可能延后变量定义式的出现时间 当你定义了一个变量,其类型带有构造函数和析构函数,当程序控制流(control flow)到达此变量定义式时,你需要承担构造成本…
原文点击这里 问题描述 我刚从 Java 转到使用 C++ 进行面向对象开发,我发现一个很让我非常困惑的问题:C++ 中经常出现使用对象指针,而不是直接使用对象本身的代码,比如下面这个例子: C++ Object myObject = new Object; 1 Object myObject = new Object; 而不是使用: C++ Object myObject; 1 Object myObject; 要不就是调用对象的方法(比如 testFunc())时不使用这种方式: C++ m…
31 : Minimize compilation dependencies between files 1 这关乎C++的类(或说都是类惹的祸) 1.1 C++类定义式的问题 C++类定义式不只叙述了class接口,还包括十足的实现细目.将导致编译依存关系(compilation dependency),更严重的将导致 连串编译依存关系(cascading compilation dependencies),会对许多项目造成难以形容的灾难. 通常是指类的内部成员,解决方法有两种 1.1.1 p…
这几天看了下这本书<编写高质量代码_改善C++程序的150个建议>,觉的蛮有收获的,再次记录下自己以前不清晰的知识点,以供学习. 编写符合标准的main函数 C语言标准规定了main函数的两种标准形式: int main(void) int main(int argc, char* argv[]) C++03标准中给出了两种main函数的定义方式 int main() int main(int argc, char *argv[]) 上述标准都要求main函数返回一个整型数值 extern C…
条款26 : 尽可能延后变量定义式的出现时间 1. 你不只应该延后变量的定义,直到非得使用该变量的前一刻为止,甚至应该尝试延后这份定义直到能够给它初值实参为止.这样,不仅能够避免构造(和析构)非必要对象,还可以避免无意义的default构造行为. 2. 考虑下面两个循环: // 方法A:定义于循环外 Widget w; ; i < n; ++i) { w = 取决于i的某个值; ..... } // 方法B:定义于循环内 ; i < n; ++i) { Widget w(取决于i的某个值);…
(一)先看以下这些代码: class PrettyMenu { public: void changeBackground(istream& imgSrc); private: Mutex mutex; //由于这个class希望用于多线程环境,所以它有这个相互排斥器作为并发控制之用 Image* bgImage; //眼下的背景图像 int imageChanges; //背景图像被改变的次数 }; void PrettyMenu::changeBackground(std::istream…
<Item29> Strive for exception-safe code. 1.如下面的代码 class PrettyMenu { public: ... void changeBackground(std::istream& imgSrc); // change background ... // image private: Mutex mutex; // mutex for this object Image *bgImage; // current background…
<Item 22> Declare data members private 1.使数据成员private,保持了语法的一致性,client不会为访问一个数据成员是否需要使用括号进行函数调度,还是不使用括号直接访问成员而纠结. 2.使数据成员private,if you use functions to get or set its value, you can implement no access, read-only access, and read-write access. Heck…
异常安全的代码是指,满足两个条件 1异常中立性 : 是指当你的代码(包括你调用的代码)引发异常时,这个异常 能保持原样传递到外层调用代码.(异常中立,就是指任何底层的异常都会抛出到上层,也就相当于是异常透明的.) 2.异常安全性: 抛出异常后,资源不泄露, 抛出异常后,不会使原有数据恶化(例如正常指针变野指针) 少些try catch,因为大量的try catch会影响代码逻辑.导致代码丑陋混乱不优雅 一段代码要具有异常安全性,必须同时具有异常中立性和一定等级的异常安全性保证 异常安全的等级一般…