自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Always On The Way

精彩的学习生活,不留遗憾!打造我的锦囊妙袋!!!

  • 博客(51)
  • 资源 (2)
  • 收藏
  • 关注

原创 使object_pool支持3个以上构造函数参数

boost中的object_pool的construct函数最多支持3个参数,但是可以扩展,我用了辅助函数模板的方式:#include using namespace boost;class demo_class{public: int x,y,z,w; demo_class(int x=1,int y=2,int z=3,int w=4):x(x),y(y),z(z),w(w)

2013-01-15 10:57:16 688

原创 shared_ptr用于Bridge模式和Factory模式

(1)用于Bridge模式:#include using namespace boost;class sample {private: class impl; boost::shared_ptr p;public: sample(); void print();};class sample::impl{public: void print() { cout

2013-01-14 15:39:39 592

原创 Proxy模式

意图:为其他独享提供一种代理以控制这个对象的访问。适用性:(1)远程代理:为一个对象在不同的地址空间提供局部代表。(2)虚代理:根据需要创建开销很大的对象。(3)保护代理:控制对原始对象的访问。(4)智能指引:取代简单的指针,在访问对象时,执行一些附加操作,比如引用计数。结构如下:实现Gof的虚代理的例子:class Graphic{public: vir

2013-01-14 11:42:19 497

原创 未捕获和意外的异常处理

一、未捕获异常:    如果没有任何一个层次的异常处理器能够捕获某种异常,则一个特殊的库函数terminate()(在头文件中定义)会被自动调用。默认情况下terminate()函数调用标准C库函数abort()使程序执行异常终止而退出。    abort()函数不会调用正常的终止函数,全局对象和静态对象的析构函数不会执行。    terminate()函数还会在如下两种情况下执行:

2013-01-11 08:57:00 1882

原创 异常的总结

(1)在匹配的过程中,不会将一种异常类型自动转换为另一个中异常。class Exception1{};class Exception2{public: Exception2(const Exception1&) {}};void f(){ throw Exception1();}int _tmain(int argc, char* argv[]){ try {

2013-01-08 15:16:55 419

原创 多线程内存池实现

多线程的内存池是基于模板的类:template class MTMemoryPool{public: void* alloc(size_t size); void free(void* someElement);private: POOLTYPE stPool; LOCK theLock;};template void* MTMemoryPool::alloc(size

2013-01-08 09:16:56 1373

转载 vs配置posix多线程开发环境

1.下载Posix库到本地磁盘。 点此链接2.解压后会有三个文件夹。Pre-built.2就包含头文件,库和dll。pthreads.2是一些源代码。3.在VS中依次: 工具->选项->项目和解决方案->VC++目录->(看到右上角的“显示一下内容的目录”下拉框)包含文件->(点击下文件夹图标后)添加以下目录D:\Program Files\Microsoft Visual S

2013-01-08 09:00:17 2079

原创 单线程不固定大小对象的内存池实现

内存块类头文件://MemoryChunk.hclass MemoryChunk{public: MemoryChunk(MemoryChunk* nextChunk,size_t chunkSize); ~MemoryChunk() {delete[] mem;} void * alloc(size_t size); void free(void* someElement)

2013-01-08 08:32:25 1190

原创 单线程固定大小对象的内存池实现

内存池适用于频繁的分配和释放对象的情况。实现思想:因为对象大小固定,故由内存池之间分配一个大小固定的内存块的链表。每次申请取其中第一块内存块使用。当已经分配的内存块使用完毕后,再申请新的内存块链表供使用。在使用完毕后,再将内存块归还到链表中,添加到表头处。内存池的定义如下:template class MemoryPool{public: MemoryPool(si

2013-01-07 21:57:00 1162

原创 容器

Item 1 仔细选择你的容器标准序列容器:vector、string、deque和list。vector是默认使用的序列类型。只有vector的内存布局兼容C。list适用于频繁的插入和删除的情景。当大部分插入和删除发生在序列的头或尾部时,可以选择deque。标准STL关联容器:set、multiset、map和multimap。非标准序列容器:slist和rope。 //没有用

2013-01-07 19:32:51 483

原创 windows平台获取本机IP地址

首先包含#include #pragma comment(lib, "ws2_32.lib")代码:int _tmain(int argc, char* argv[]){ WSADATA wsaData; WORD sockVersion = MAKEWORD(2, 2); ::WSAStartup(sockVersion, &wsaData); char lv_n

2013-01-07 19:09:34 615

原创 跟踪实例

如下两个跟踪类:(1)采用const string&传递参数。class Trace{public: Trace(const string& name):theFunctionName(name) { if(traceIsActive) { cout<<"Enter funciton"<<theFunctionName<<endl; } } ~Trace()

2012-12-28 09:53:59 500

原创 杂项讨论

item 32 在未来时态下编程。牢记事情会改变。或许应了那句哲学道理:静止是相对的,运动是绝对的。这个虽然能做到不是那么容易的事情,但是只要有了这方面的意识,就吵着这方面的努力。进一步学习面向对象和泛型编程的知识,并在实际工作不断的实践体会。Item 33 将非尾端的类设计为抽象类。当原有的具体类被当作基类使用,才强迫导入一个新的抽象类。坚持这个原则,可以提升整个软件的可靠度

2012-12-27 12:46:37 360

原创 技术(7)——让函数根据一个以上的对象类型来决定如何虚化

假设要做一个太空中各种天体的碰撞,其中涉及宇宙飞船、太空战、小行星等天体。定义如下:class GameObject{public: virtual void collideResult()=0; virtual ~GameObject()=0;};GameObject::~GameObject() { }class SpaceShip:public GameObject

2012-12-27 12:27:06 497

原创 技术(6)—代理类

Item 30 代理类:“用来代表其他对象”的对象。(1)阻止只有一个参数的类执行隐式类型转换的方法。template class Array{public: class ArraySize { public: ArraySize(int numElements):theSize(numElements) {} int size() const {return theS

2012-12-26 14:16:09 415

原创 技术(5)—引用计数

Item 29 引用计数这是我看这系列以来,感觉最难的一部分内容,比较综合。使用引用计数改善效率的最适当时机:(1)相对多数的对象共享相对少量的实值。(2)对象实值的产生或销毁的成本很高。在书中实现了一个用来支持引用计数的基类和智能指针类,具体如下:RCObject:头文件:class RCObject{protected: RCObject(void);

2012-12-26 12:25:51 468

原创 技术(4)—智能指针

Item 28 智能指针在看着条目之前,我能想到的就是资源管理。能帮助我们自动释放在heap分配的空间,免去内存泄漏之苦。我主要想记录下auto_ptr。首先定义类Test:class Test{public: Test(int initValue):value(initValue) {} int getValue() const {return value;} vo

2012-12-25 14:57:17 438

原创 技术(3)—要求(或禁止)对象产生于heap之中

Item 27 要求(或禁止)对象产生于heap之中。(1)要求对象产生于heap之中。class UPNumber{public: UPNumber():value(0) {cout<<"UPNumber"<<endl;} UPNumber(int initValue):value(initValue) {cout<<"UPNumber(int initValue)"<<endl

2012-12-25 12:18:33 532

原创 技术(2)—限制某个class所能产生的对象数量

Item26 限制某个class所能产生的对象数量。(1)0个:将构造函数声明为private。(2)1个:Sigleton模式。(3)指定个数,方法如下:写一个基类,用来对象计数:Counted.htemplate class Counted{public: class TooManyObjects {}; static int objectCount() {r

2012-12-24 16:31:13 480

原创 技术(1)—构造函数和非成员函数的虚化

Item 25 将construtor和non-member functions虚化。所谓virtual constructor是某种函数,视其获得的输入,可产生不同类型的对象。上例中的readComponent()函数就是一个虚构造函数。virtual copy constructor返回一个指针,指向其调用者的一个新副本。virtual copy constructor实际上调用真正的

2012-12-24 10:17:32 499

原创 效率(2)

Item 21 利用重载技术避免隐式类型转换。class UInt{public: UInt():value(0) {} UInt(int value):value(value) {} friend const UInt operator+(const UInt& lhs,const UInt& rhs) { return UInt(lhs.value+rhs.value);

2012-12-23 20:36:01 321

原创 效率(1)

Item 16 谨记80-20原则。一个程序80%的资源用于20%的代码上。约80%的执行时间大约花在20%的代码上。80%的内存大约被20%的代码使用。80%的磁盘访问动作由20%的代码执行。80%的维护力气花在20%的代码上。要很好的提高程序的执行效率,尽量用代码分析器分析代码的瓶颈所在,而不是凭着经验猜测。Item 17 考虑使用lazy evaluation。

2012-12-23 08:54:04 363

原创 异常

Item 9 Use destructors to prevent resoruce leaks.利用析构函数避免泄露资源。class ALA{public: virtual void ProcessAdoption()=0;};class Puppy:public ALA{public: virtual void ProcessAdoption() {}};class

2012-12-22 12:58:15 408

原创 操作符

Item 5 Be wary of user-defined conversion functions.对用户定制的“类型转换函数”保持警觉。(1)含有单自变量的构造函数,包括两种情况,构造函数只有一个参数,或者有多个参数,但是除第一个参数外,都有默认值。class Name{public: Name(const string& s):name(s) {}private: str

2012-12-22 09:39:16 443

原创 猫大叫一声,所有的老鼠都开始逃跑,主人被惊醒

前几天看到有个朋友写的一篇blog题目如下:猫大叫一声,所有的老鼠都开始逃跑,主人被惊醒。要求:(1)要有联动性,老鼠和人的行为是被动的。        (2)考虑可扩展性,猫叫声可能会引起其他的联动效应。我不是一个善于做题目的人,但是这个题目想到了观察者设计模式,猫是目标,老鼠和主人是观察者,在猫叫的时候,通知老鼠和主人行动。另外联动效应部分采用策略设计模式。这样如果有其他的

2012-12-21 17:55:28 4781 3

原创 基础议题

Item 1 Distinguish between pointers and references.仔细区别指针和引用。首先:没有null references。一个reference必须总代表某个对象。因此在用引用作为函数参数时,在函数内部可以不用对参数进行有效性测试。如果有个变量,其目的是用来指向另一个对象,也有可能不指向另一个对象,请使用pointers。其次:pointers

2012-12-21 15:13:34 420

原创 杂项讨论

Item 53 Pay attention to compiler warnings.不要轻忽编译器的警告。努力在编译器的最高警告级别下争取“无任何警告”的荣誉。不要过度依赖编译器的报警能力,因为不同的编译器对待事情的态度并不相同,一旦移植到另一个编译器上,你原本依赖的警告信息可能消失。Item 54 Familiarize yourself with the standard lib

2012-12-21 09:35:35 371

原创 定制new和delete

Item 49 Understand the behavior of the new-handler.了解new-handler的行为。当operator new抛出异常之前以反映一个未满足的内存需求之前,会先调用称为new-handler的客户指定的错误处理函数。new_handler是一个typedef的函数指针:typedef void ( *new_handler )( );定

2012-12-20 13:55:06 464

原创 模板与泛型编程

Item 41 Understand implicit interfaces and compile-time polymorphism. 了解隐式接口和编译期多态。类和模板都支持接口和多态。对于类,接口是显式的。显式接口由函数的声明(函数名称、参数类型、返回类型)构成。多态则是通过virtual函数发生于运行期。对于模板,接口是隐式的。隐式接口是由有效表达式组成。多态是通过templ

2012-12-19 10:21:39 444

原创 Sigleton模式

意图:保证一个类仅有一个实例,并且提供一个访问它的全局访问点。让类自身负责保存它的唯一实例。Sigleton.h文件中:#include #include using namespace std;enum TypeName{ __Sigleton, __SigletonDerivedClass1, __SigletonDerivedClass2};

2012-12-18 13:59:44 682 2

原创 Strategy模式

class AbstractStrategy{public: virtual void Algorithm(int data)=0; virtual ~AbstractStrategy() {}};class ConcreteStrategy1 : public AbstractStrategy{public: void Algorithm(int data) { cou

2012-12-17 13:31:18 406

原创 Template method模式

class AbstractClass{public: void templateMethod() { PrimitiveOperation1(); PrimitiveOperation2(); } virtual void PrimitiveOperation1()=0; virtual void PrimitiveOperation2()=0;};

2012-12-17 12:28:17 368

原创 继承与面向对象设计

Item 32 Make sure public inheritance models "is-a".适用于base classes身上的每一件事情也一定适用于derived classes身上,因为每一个derived class对象也是一个base class对象。这就是Liskov替换原则:子类型必须能够替换掉他们的基类型。Item 33 Avoid hiding inherit

2012-12-17 10:40:05 352

原创 实现

Item 26 Postpone variable definitions as long as possible.由于自定义类型在定义变量的时候设计构造函数和析构函数的开销,因此应尽可能延后变量的定义。印象比较深的是如下两段代码:Widget w;for(int i=0;i<n;i++){ w=取决于i的某个值;} for(int i=0;i<n;i++){ Wi

2012-12-17 10:27:46 334

原创 设计与声明

Item18 Make interfaces easy to use correctly and hard to use incorrectly.程序员在自定义接口的时候,要注意与内置行为的类型保持兼容性。容易正确使用,举例如下:class Date{public: Date(int month,int day,int year);};不如下面的形式,防止传错参数,并且可对

2012-12-14 09:30:35 399

原创 资源管理

Item13 Use objects to manage resoruces. 即用专门的对象来管理资源。常用的就是中的auto_ptr和tr1::shared_ptr。主要为了防止资源泄露,请使用RAII对象,他们在构造函数中获得资源并在析构函数中释放资源。RAII:Resource Acquisition is Initialization。举例如下:class Investm

2012-12-13 10:10:14 340

原创 Lenovo G470 windows server 2008 R2安装

机器:Lenovo G470(1)引导:遇到的第一个问题就是从光驱引导。对于G470在开机画面出现Logo的时候,按下F12进入Boot  device select menu项,选择ODD-..DVD....字样即可。启动后按照提示安装即可,选择一个合适的分区。复制windows文件、展开windows文件、安装功能、安装更新、完成安装,只需等待即可。完成后重新启动,在引导页面就

2012-12-12 11:56:48 1255

原创 构造/析构/复制运算

Item5 Know what functions C++ silently writes and calls.编译器可为一个类默认生成默认构造函数、拷贝构造函数和赋值运算符以及析构函数。注意有指针成员的情况下,默认生成的拷贝构造函数和赋值运算符只是简单的拷贝指针的值,指针指向的数据并不拷贝,即执行的为“浅拷贝”。有可能造成指针指向一个已经释放的内存位置。顾在这样的情况下最好自己实现拷贝构造函

2012-12-11 10:03:18 388

原创 让自己习惯C++

Item1 View C++ as a federation of languages。 C、Object-Oriected C++、Template C++、STL。Item2 Prefer consts, enums, and inlines to #defines。比如#define ASPECT_RATIO 1.653替换为const double AspectRatio=1.653;

2012-12-10 10:16:54 442

转载 Win7下QT开发环境搭建

首先是软件准备:需要下载两个软件qt-win-opensource-4.4.0-mingw(ftp://ftp.trolltech.com/qt/source/qt-win-opensource-4.4.0-mingw.exe)MinGw(http://www.mculee.cn/upload/MinGW-3.4.2.exe)软件安装过程:先安装MinGW。路径尽量短,任意

2012-11-30 09:32:58 2582

OpenGL编程指南

介绍OpenGL和OpenGL实用库。内容全面、权威。被称为“OpenGL红宝书”

2011-10-08

深度探索C++对象模型

深入学习C++的资料

2007-06-26

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除