首页 > 代码库 > 学习日记之享元模式和Effective C++

学习日记之享元模式和Effective C++

享元模式(Flyweight):运用共享技术有效地支持大量细粒度的对象。

(1),享元模式可以避免大量非常相似的开销。在程序设计中,有时需要生成大量细粒度的类实例来表示数据。如果能发现这些实例除了几个参数外基本上都是相同的,有时就能大幅度地减少需要实例化的类的数量。如果能把这些参数移到类的外面,在方法调用时将他们传递进来,就可以通过共享大幅度减少实例的数目。

(2),如果一个应用使用了大量的对象,而这些对象造成很大的存储开销的时候就考虑使用;还有就是对象的大多数状态可以外部状态,如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象。


Effective C++:


1:请使用 traits classes 表现类型信息

(1),Traints classes 使得“类型相关信息”在编译器可用。他们以 templates 和 “templates 特化”完成实现。

(2),整合重载技术(voerloading)后,traits classes 有可能在编译器对类型执行 if...else 测试。

2:认识 template 元编程

(1),Template metaprogramming(TMP,模板元编程)可将工作由运行期移往编译期,因为可以实现早期错误侦测和更高的执行效率。

(2),TMP 可被用来生成“基于政策选择组合”(based on combinations of policy choices)的客户定制代码,也可用来避免生成对某些特殊类型并不适合的代码。


今日工作问题:

对于QMainWindow窗体,在show ,resize 时候,系统会在重绘前将原来的背景使用系统默认背景色擦除,如果系统默认背景色和当前窗体背景色不同,那么就会有闪烁现象。

探索1:使用setSysColor将系统背景色改为窗体背景色                                结论:setSysColor会改变系统所以窗体背景色,失败。

探索2:使用qt自带双缓冲,设置window attribute 为Qt::WA_OpaquePaintEvent或者 Qt::WA_NoSystemBackground    结论:对背景闪烁问题没有作用


期望:1.希望可以通过跟踪源码,找到具体系统绘制原理,解决闪烁问题。

            2.通过改变某个窗体的背景色,禁用系统默认背景色绘制或者擦除操作解决闪烁问题。