学习日记之大话设计模式和Effective C++大结局

第一次潜心学习一个月时间,看完了《大话设计模式》和《Effective C++》两本书,两本书的前半部分都比较容易,但是后期的部分,比如:C++的内存,异常和模板的知识就很难理解了。也许和自己很少用异常处理和模板的关系吧。自己坚持了一个月,无论如何,这两本书给我带来了很多新的知识,发现了自己的不足。接下来打算继续看《C++ Templates》这本书,希望能弥补自己在模板编程方便的不足和为以后研究STL和Boost打下坚实的基础。废话少说,言归正传。下面说一下两本书的最后一点知识点。

访问者模式(Visitor):表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。

(1),访问者模式适用于数据结构相对稳定的系统。

(2),访问者模式把数据结构和作用于结构上的操作之间的耦合解脱开,使得操作集合可以相对自由的演化。

(3),访问者模式的目的是要把处理从数据结构分离开来。

(4),访问者模式的有点在于增加新的操作很容易,因为增加新的操作就意味着增加一个新的访问者。访问者模式将有关的行为集中到一个访问者对象中。

(5),访问者模式的缺点在于增加新的数据结构变得困难。

Effective C++:

1:编写 new 和 delete 时需固守常规

(1),operator new 应该内含一个无穷循环,并在其中尝试分配内存,如果它无法满足内存需求,就该调用 new-handler。它也应该有能力处理 0 bytes 的申请。class 专属版本则还应该处理“比正确大小更大的申请”。

(2),operator delete 应该在收到 null 指针时不做任何事。 Class 专属版本则应该处理“比正确大小更大的错误申请”。

2:写了 placement new 也要写 placement delete

(1),当你写一个 placement operator new ,请确定也写出了对应的 placement operator delete 。如果没有这样做,你的程序可能会发生隐危而时断时续的内存泄露。

(2),当你声明 placement new 和 placement delete ,请确定不要无意识地遮掩了他们呢的正常版本。

3:不要轻易忽略编译器的警告

(1),严肃对待编译器发出的警告信息。努力在你的编译器的最高警告级别下争取“无任何警告”。

(2),不要过度依赖编译器的报警能力,因为不同编译器对待事情的态度并不相同,一旦移植到另一个编译器上,你原来依赖的警告信息有可能消失。

4:让自己熟悉包括 TR1 在内的标准程序库

(1),C++ 程序库的主要机能由 STL、 iostreams、 locales组成。并包含 C99标准程序库。

(2),TR1 添加了智能指针、一般化函数指针、 hash-based 容器、正则表达式以及另外是个组件的支持。

(3),TR1 自身只是一份规范。为获得TR1提供的好处,你需要一份实物。一个好的实物来自 Boost。

5:让自己熟悉 Boost

(1),Boost 是一个社群,也是一个网站。致力于免费、源码开放、同僚复审的C++ 程序库开发。Boost 在 C++ 标准化过程中扮演深具影响力的角色。

(2),Boost 提供许多TR1 组件实现品,以及许多其它程序库。

今日发现:

NCFramelessHelper利用qt内部事件实现了顶层无边框窗体的拖拽,移动等功能。

问题:vlc 和 directx在播放视频时,会受到顶层窗体 WA_translucentPaintEvent属性影响,无法显示视频。暂时没找的合适解决方案。

学习日记之大话设计模式和Effective C++大结局,布布扣,bubuko.com

时间: 2024-12-16 16:47:42

学习日记之大话设计模式和Effective C++大结局的相关文章

学习日记之迭代器模式和Effective C++

迭代器模式(Iterator):提供一种方法顺序访问一个聚合对象的各个元素,而又不暴露该对象的内部表示. (1),当需要访问一个聚合对象,而且不管这些对象是什么都需要遍历的时候,你就应该考虑迭代器模式. (2),你需要对聚集有多种方式遍历时,可以考虑用迭代器模式. (3),当遍历不同的聚集结构,应提供如开始.下一个.当前项等统一的接口. (4),迭代器模式就是分离了集合对象的遍历行为,抽象出一个迭代器来负责,这样即可以做到不暴露集合的内部结构,又可让外部代码透明地访问集合内部的数据. Effec

学习日记之状态模式和Effective C++

状态模式(State):当一个对象内在状态改变时,允许改变其行为,这个对象看起来像是改变了其类. (1),状态模式主要负责解决的是当控制一个对象转换的条件表达式过于复杂时的情况.把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化. (2),状态模式的好处是将与特定状态相关的行为局部化,并且将不同状态的行为分割开来. (3),将特定的状态相关的行为都放入一个对象中,由于所有与状态相关的代码都存在于某个ConcreteState中,所以通过定义新的子类可以很容易地增加新的状态和

学习日记之解释器模式和Effective C++

解释器模式(interpreter):给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子. (1),如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言的句子.这样可以构建一个解释器,该解释器通过解释这些句子来解决该问题. (2),当一个语言需要解释执行,并且你可将该语言中的句子表示为一个抽象的语法树时,可使用解释器模式. (3),容易改变和扩展文法,因为该模式使用类来表示文法规则,你可以使用继承来改变和扩展该文法

学习日记之组合模式和Effective C++

组合模式(Composite):将对象组合成树形结构以表示"部分-整体"的组合结构,组合模式使得用户对单个对象和组合对象的使用具有一致性. 透明方式和安全方式 (1),透明方式:在 Component 中声明所有用来管理子对象的方法,其中包括 Add. Remove 等.这样实现 Component 接口的所有子类都具备了 Add.Remove 方法.这样做的好处是子类对外界来说没有区别,他们具有完全一致的行为接口.但也有问题,有些子类不具备某些功能,所以实现那些接口没有意义. (2)

学习日记之命令模式和Effective C++

命令模式(Command): 讲一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求队列或记录请求日志,以及支持可撤销的操作. 命令模式优点: (1),它能较容易地设计一个命令队列. (2),在需要的情况下,可以较容易地将命令计入日志. (3),允许接收请求的一方决定是否要否决请求. (4),可以容易地实现请求的撤销和重做. (5),由于加进新的具体命令类不影响其他的类,因此增加新的具体命令类很容易. (6),命令模式把请求一个操作的对象与知道怎么执行一个操作的对象分割开. (

学习日记之建造者模式和Effective C++

建造者模式(Builder):建一个复杂的对象的构建和它的表示分离,使得同样的构造过程可以创建不同的表示. (1),主要创建一些复杂的对象,这些对象内部构建间的建造顺序通常是稳定的,但对象内部的构建通常面临着复杂的变化. (2),建造者模式的好处就是使得建造代码和表示代码分离,由于建造者隐藏了该产品是符合组装的,所以如需要改变一个产品的内部表示,主需要在定义一个具体的建造者就可以了. (3),建造者模式是在创建复杂对象的算法应该独立于该对象的组成部分以及他们的装配方式时适用的模式. Effect

学习日记之模板方法模式和 Effective C++

模板方法模式: 定义:定义一个操作中的算法的骨架.而将一些步骤延伸到子类中.模板方法使得子类能够不改变算法的结构就可以重定义该算法的某些特定步骤. (1),用了继承,而且肯定这个继承有意义的情况下.就应该要成为子类的模板,所以反复的代码都应该提升到父类中,而不是让每一个子类去反复. (2).当我们要完毕某一个细节层次一致的过程或者一系列步骤,但其个别步骤在更具体的层次上的实现可能不同一时候.我们通常考虑模板方法模式来处理. (3),模板方法模式通过把不变的行为搬移到超类.去除子类中的反复代码来体

学习日记之原型模式和Effective C++

原型模式(Prototype):用原型实例制定创建对象的种类,而且听过拷贝这些原型创建新的对象. 浅复制:假设字段是值类型的,则对该字段运行逐位复制.假设字段是引用类型.则复制引用但不复制引用的对象.因此,原始对象及其副本引用同一对象. 深复制:把引用变量的对象指向复制过的新对象.而不是原有的被引用的对象. Effective C++: 1:在资源管理类中提供对原始资源的訪问. (1).APIs 往往要求訪问原始资源(raw resources),所以每个 RAII class 应该提供一个"取

《大话设计模式》学习笔记系列--1. 简单工厂模式

简单工厂模式实现了一种"工厂"概念的面向对象设计模式,它可以在不指定对象具体类型的情况下创建对象.其实质是定义一个创建对象的接口,但让实现这个接口的类来决定实例化具体类.工厂方法让类的实例化推迟到子类中进行. 以书本上的计算器程序为例,其UML描述如下: 图中,AddOperator, SubtactOpertor继承算式基类Operator,而CreateOperator则是负责创建一个操作类,而不指明具体的子类类型. 下面,我们来看代码: 首先操作积累: /// <summa