摘要:
http://blog.csdn.net/feixiaoxing/article/details/7104338【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 享元模式看上去有点玄乎,但是其实也没有那么复杂。我们还是用示例说话。比如说,大家在使用电脑的使用应该少不了使用WORD软件。使用WORD呢, 那就少不了设置模板。什么模板呢,比如说标题的模板,正文的模板等等。这些模板呢,又包括很多的内容。哪些方面呢,比如说字体、标号、字距、行距、大小等 等。[cpp] view plaincopytypedefstruct_Font{inttyp. 阅读全文
posted @ 2012-01-18 12:29
董雨
阅读(338)
评论(0)
推荐(0)
摘要:
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 代理模式是一种比较有意思的设计模式。它的基本思路也不复杂。举个例子来说,以前在学校上网的时候,并不是每一台pc都有上网的权限的。比如说,现在有pc1、pc2、pc3,但是只有pc1有上网权限,但是pc2、pc3也想上网,此时应该怎么办呢? 此时,我们需要做的就是在pc1上开启代理软件,同时把pc2、pc3的IE代理指向pc1即可。这个时候,如果pc2或者pc3想上网,那么报文会先指 向pc1,然后pc1把Internet传回的报文再发给pc2或者pc3。这样一个代理的过程就完成了整个的... 阅读全文
posted @ 2012-01-18 12:27
董雨
阅读(385)
评论(0)
推荐(0)
摘要:
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 前面我们写过的工厂模式实际上是对产品的抽象。对于不同的用户需求,我们可以给予不同的产品,而且这些产品的接口都是一致的。而抽象工厂呢?顾名思义,就是说我们的工厂是不一定的。怎么理解呢,举个例子。 假设有两个水果店都在卖水果,都卖苹果和葡萄。其中一个水果店买白苹果和白葡萄,另外一个水果店卖红苹果和红葡萄。所以说,对于水果店而言,尽管都在卖水果,但是两个店卖的品种不一样。 既然水果不一样,那我们先定义水果。[cpp] view plaincopytypedefstruct_Apple{vo... 阅读全文
posted @ 2012-01-18 12:26
董雨
阅读(695)
评论(0)
推荐(0)
摘要:
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 使用过C++的朋友大概对迭代器模式都不会太陌生。这主要是因为我们在编写代码的时候离不开迭代器,队列有迭代器,向量也有迭代器。那么,为什么要迭代器呢?这主要是为了提炼一种通用的数据访问方法。 比如说,现在有一个数据的容器,[cpp] view plaincopytypedefstruct_Container{int*pData;intsize;intlength;Interator*(*create_new_interator)(struct_Container*pContainer);... 阅读全文
posted @ 2012-01-18 12:26
董雨
阅读(264)
评论(0)
推荐(0)
摘要:
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 外观模式是比较简单的模式。它的目的也是为了简单。什么意思呢?举个例子吧。以前,我们逛街的时候吃要到小吃一条街,购物要到购物一条街,看书、看电影要 到文化一条街。那么有没有这样的地方,既可以吃喝玩乐,同时相互又靠得比较近呢。其实,这就是悠闲广场,遍布全国的万达广场就是干了这么一件事。 首先,我们原来是怎么做的。[cpp] view plaincopytypedefstruct_FoodSteet{void(*eat)();}FoodStreet;voideat(){printf("e 阅读全文
posted @ 2012-01-18 12:26
董雨
阅读(224)
评论(0)
推荐(0)
摘要:
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 工厂模式是比较简单,也是比较好用的一种方式。根本上说,工厂模式的目的就根据不同的要求输出不同的产品。比如说吧,有一个生产鞋子的工厂,它能生产皮鞋,也能生产胶鞋。如果用代码设计,应该怎么做呢?[cpp] view plaincopytypedefstruct_Shoe{inttype;void(*print_shoe)(struct_Shoe*);}Shoe; 就像上面说的,现在有胶鞋,那也有皮鞋,我们该怎么做呢?[cpp] view plaincopyvoidprint_leather... 阅读全文
posted @ 2012-01-18 12:25
董雨
阅读(401)
评论(0)
推荐(0)
摘要:
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 责任链模式是很实用的一种实际方法。举个例子来说,我们平常在公司里面难免不了报销流程。但是,我们知道公司里面每一级的领导的报批额度是不一样的。比如说,科长的额度是1000元,部长是10000元,总经理是10万元。 那么这个时候,我们应该怎么设计呢?其实可以这么理解。比如说,有人来找领导报销费用了,那么领导可以自己先看看自己能不能报。如果费用可以顺利报下来当然最好,可是万一报不下来呢?那就只能请示领导的领导了。[cpp] view plaincopytypedefstruct_Leader{.. 阅读全文
posted @ 2012-01-18 12:25
董雨
阅读(519)
评论(0)
推荐(0)
摘要:
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 模板对于学习C++的同学,其实并不陌生。函数有模板函数,类也有模板类。那么这个模板模式是个什么情况?我们可以思考一下,模板的本质是什么。比如说,现在我们需要编写一个简单的比较模板函数。[cpp] view plaincopytemplate<typenametype>intcompare(typea,typeb){returna>b?1:0;} 模板函数提示我们,只要比较的逻辑是确定的,那么不管是什么数据类型,都会得到一个相应的结果。固然,这个比较的流程比较简单,即使没有采 阅读全文
posted @ 2012-01-18 12:24
董雨
阅读(310)
评论(0)
推荐(0)
摘要:
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 原型模式本质上说就是对当前数据进行复制。就像变戏法一样,一个鸽子变成了两个鸽子,两个鸽子变成了三个鸽子,就这么一直变下去。在变的过程中,我们不需要考虑具体的数据类型。为什么呢?因为不同的数据有自己的复制类型,而且每个复制函数都是虚函数。 用C++怎么编写呢,那就是先写一个基类,再编写一个子类。就是这么简单。[cpp] view plaincopyclassdata{public:data(){}virtual~data(){}virtualclassdata*copy()=0;};cl... 阅读全文
posted @ 2012-01-18 12:23
董雨
阅读(264)
评论(0)
推荐(0)
摘要:
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 组合模式听说去很玄乎,其实也并不复杂。为什么?大家可以先想一下数据结构里面的二叉树是怎么回事。为什么就是这么一个简单的二叉树节点既可能是叶节点,也可能是父节点?[cpp] view plaincopytypedefstruct_NODE{void*pData;struct_NODE*left;struct_NODE*right;}NODE; 那什么时候是叶子节点,其实就是left、right为NULL的时候。那么如果它们不是NULL呢,那么很明显此时它们已经是父节点了。那么,我们的这个... 阅读全文
posted @ 2012-01-18 12:23
董雨
阅读(316)
评论(0)
推荐(0)
摘要:
http://blog.csdn.net/feixiaoxing/article/details/7068053【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 关于软件设计方面的书很多,比如《重构》,比如《设计模式》。至于软件开发方式,那就更多了,什么极限编程、精益方法、敏捷方法。随着时间的推移,很多的方法又会被重新提出来。 其实,就我个人看来,不管什么方法都离不开人。一个人写不出二叉树,你怎么让他写?敏捷吗?你写一行,我写一行。还是迭代?写三行,删掉两行,再写三行。 项目的成功是偶然的,但是项目的失败却有很多原因,管理混乱、需求混... 阅读全文
posted @ 2012-01-18 12:22
董雨
阅读(287)
评论(0)
推荐(1)
摘要:
http://blog.csdn.net/feixiaoxing/article/details/7071202【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 有过面试经验的朋友,或者对设计模式有点熟悉的朋友,都会对单件模式不陌生。对很多面试官而言,单件模式更是他们面试的保留项目。其实,我倒认为,单件模式算不上什么设计模式。最多也就是个技巧。 单件模式要是用C++写,一般这么写。 #include <string.h> #include <assert.h> class object { ... 阅读全文
posted @ 2012-01-18 12:22
董雨
阅读(374)
评论(0)
推荐(0)
摘要:
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 定时器是我们需要经常处理的一种资源。那linux下面的定时器又是怎么一回事呢?其实,在linux里面有一种进程中信息传递的方法,那就是信号。这里的定时器就相当于系统每隔一段时间给进程发一个定时信号,我们所要做的就是定义一个信号处理函数。[cpp] view plaincopy#include<stdio.h>#include<time.h>#include<sys/time.h>#include<stdlib.h>#include<sig 阅读全文
posted @ 2012-01-18 12:19
董雨
阅读(277)
评论(0)
推荐(0)
摘要:
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 在我们编写软件的过程当中,少不了需要使用别人的库函数。因为大家知道,软件是一个协作的工程。作为个人来讲,你不可能一个人完成所有的工作。另外,网络上一些优秀的开源库已经被业内广泛接受,我们也没有必要把时间浪费在这些重复的工作上面。 既然说到了库函数,那么一般来说库函数分为两种方式:静态库和动态库。两者的区别其实很小,静态库是必须要链接到执行文件中去的,而动态库是不需要链接到 最后的执行文件中的。怎么理解呢?也就是说,对于最后的执行文件而言,你是否删除静态库无所谓。但是,一旦你删除了动态库... 阅读全文
posted @ 2012-01-18 12:18
董雨
阅读(232)
评论(1)
推荐(0)
摘要:
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 动态链接库不是linux独有的特性,在windows下面也存在这样的特性。一般来说,windows下面的动态连接库是以*.dll作为结尾的,而 linux下面的动态连接库是以*.so结尾的。和静态链接库相比,动态连接库可以共享内存资源,这样可以减少内存消耗。另外,动态连接是需要经过操作系 统加载器的帮助才能被普通执行文件发现的,所以动态连接库可以减少链接的次数。有了这个特点,我们就不难发现为什么很多软件的补丁其实都是以动态库发布 的。 那么,在Linux上动态库是怎么生成的呢?[cpp... 阅读全文
posted @ 2012-01-18 12:18
董雨
阅读(239)
评论(0)
推荐(0)
摘要:
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 编写代码过程中少不了调试。在windows下面,我们有visual studio工具。在linux下面呢,实际上除了gdb工具之外,你没有别的选择。那么,怎么用gdb进行调试呢?我们可以一步一步来试试看。[cpp] view plaincopy#include<stdio.h>intiterate(intvalue){if(1==value)return1;returniterate(value-1)+value;}intmain(){printf("%d\n" 阅读全文
posted @ 2012-01-18 12:17
董雨
阅读(254)
评论(1)
推荐(0)
摘要:
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 同样是x86的cpu,但是却可以用不同形式的汇编语言来表示。在window上面我们使用的更多是intel格式的汇编语言,而在Linux系统上面使 用的更多的常常是AT&T格式的汇编语言。那什么是AT&T格式的汇编代码呢?我们可以写一个试试看。[cpp] view plaincopy.datamessage:.string"hello!\n"length=.-message.text.global_start_start:movl$length,%edxmo 阅读全文
posted @ 2012-01-18 12:17
董雨
阅读(176)
评论(0)
推荐(0)
摘要:
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 对于程序设计员来说,makefile是我们绕不过去的一个坎。可能对于习惯Visual C++的用户来说,是否会编写makefile无所谓。毕竟工具本身已经帮我们做好了全部的编译流程。但是在Linux上面,一切变得不一样了,没有人会 为你做这一切。编代码要靠你,测试要靠你,最后自动化编译设计也要靠你自己。想想看,如果你下载了一个开源软件,却因为自动化编译失败,那将会在很大程度 上打击你学习代码的自信心了。所以,我的理解是这样的。我们要学会编写makefile,至少会编写最简单的makef... 阅读全文
posted @ 2012-01-18 12:14
董雨
阅读(259)
评论(0)
推荐(0)
摘要:
http://blog.csdn.net/feixiaoxing/article/details/7194756#comments【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 在很多人的眼里,C语言和linux常常是分不开的。这其中的原因很多,其中最重要的一部分我认为是linux本身就是C语言的杰出作品。当 然,linux操作系统本身对C语言的支持也是相当到位的。作为一个真正的程序员来说,如果没有在linux下面用C语言编写过完整的程序,那么只能说他 对C语言本身的理解还相关肤浅,对系统本身的认识也不够到位。作为程序员来说,lin... 阅读全文
posted @ 2012-01-18 12:13
董雨
阅读(228)
评论(0)
推荐(0)
摘要:
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 在算术符重载里面,“=”重载可能是最经常使用的一种。但是好多人就误以为在函数中,凡是类出现“=”的地方,那就是调用算术符重载,其实不然。为什么呢?我们可以看看下面的代码。首先,我们定义一个基本类:[cpp] view plaincopyclassdata{char*value;intnumber;public:explicitdata(intnum=0){if(num){number=num;value=(char*)malloc(num);}}data(constdata&d){n 阅读全文
posted @ 2012-01-18 11:16
董雨
阅读(164)
评论(0)
推荐(0)
摘要:
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 指针是编程人员的梦魇,对C语言的开发者是如此,对C++的开发者也是如此。特别是在C++中,如果不注意处理类中的指针,非常容易出问题。如果朋友们不相信可以看看下面的代码:[cpp] view plaincopyclassdata{int*value;public:data(intnum){if(num>0)value=(int*)malloc(sizeof(int)*num);}~data(){if(value)free(value);}};voidprocess(){datam(10) 阅读全文
posted @ 2012-01-18 11:15
董雨
阅读(165)
评论(0)
推荐(0)
摘要:
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 泛型编程其实不难。本质上说,泛型编程就是让通用的算法应用到所有的数据类型。具体来说,int是我们熟悉的整数类型。那么一般情况下,如果我们写一个int整数的排序算法,应该怎么写呢?大家可以自己试试?下面的代码是我的一个范例;[cpp] view plaincopyvoidbubble_sort(intarray[],intlength){inttemp=0;intouter=0;intinner=0;assert(NULL!=array&&0!=length);for(oute 阅读全文
posted @ 2012-01-18 11:14
董雨
阅读(199)
评论(0)
推荐(0)
摘要:
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 有过C语言编程的朋友大多知道,如果在malloc内存之后不及时free掉内存,那么很有可能会造成内存泄露的。那么在C++上面,是不是也存在这样 的问题呢?结果是C++上面同样也存在内存泄露的危险。这个危险就是如果new后面不能delete的话,也会造成内存的泄露。还有不清楚的朋友可以看看 下面的示例:[cpp] view plaincopyclasstest{intdata;public:test(intvalue):data(value){}~test(){};};voidprocess( 阅读全文
posted @ 2012-01-18 11:14
董雨
阅读(228)
评论(0)
推荐(1)
摘要:
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 缺省函数是C++的一个基本特色。缺省函数定义比较简单,也就是说,对于函数的某一个输入参数或者几个输入参数,如果你没有特定的数值的话,那我们就会 用缺省的数据进行代替。如果你在调用的过程中使用了自己的数据,那么缺省数据将被我们自己定义的数据覆盖。下面就是一个缺省函数的示例:[cpp] view plaincopyintadd(intm,intn=10){returnm+n;} 如果调用呢,有什么区别?[cpp] view plaincopy262:intp=add(2);00401488pu. 阅读全文
posted @ 2012-01-18 11:13
董雨
阅读(294)
评论(0)
推荐(0)
摘要:
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 递归,相信有过基本C语言经验的朋友都明白,就是函数自己调用自己。所以,本质上说,它和普通的函数调用没有什么区别。今天之所以会把模板类和递归联系在一起,是因为我们可以用递归的方法实现模板的递归。闲话不多说,我们先从一个统计函数开始说起。[cpp] view plaincopyintprocess(intm){intindex=0;intcount=0;assert(m>=0);for(;index<=m;index++){count+=index;}returncount;} 上面 阅读全文
posted @ 2012-01-18 11:13
董雨
阅读(230)
评论(0)
推荐(0)
摘要:
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 如果类是一种确定的数据类型,那么模板就是一种对类的抽象。假设有这么一种类,它需要进行数据的计算,而且类型还很多,那么我们可能就要针对不同类型的数据定义不同的类。我们可以用下面一段代码说明问题:[cpp] view plaincopyclassint_process{inta;intb;public:int_process(intm,intn):a(m),b(n){}~int_process(){}intadd(){returna+b;}intsub(){returna-b;}intmul() 阅读全文
posted @ 2012-01-18 11:12
董雨
阅读(180)
评论(0)
推荐(0)
摘要:
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 如果说模板类定义的是一种数据类型,那么模板函数定义的就是一种函数。既然是函数,那么就有输入数据和输出数据。和模板类的概念差不多,模板函数的初衷也是为了在函数操作上抽取共同的特性,屏蔽的是类型的不同和差异。我们可以通过下面一个简单的代码说明问题:[cpp] view plaincopyintint_compare(inta,intb){returna>b?a:b;}doubledouble_compare(doublea,doubleb){returna>b?a:b;} 上面的一段 阅读全文
posted @ 2012-01-18 11:12
董雨
阅读(181)
评论(0)
推荐(0)
摘要:
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 算术符重载是类的有一个特性,但是每个人使用的方法不一样。用的好,则事半功倍;但是如果不正确的使用,则会后患无穷。 (1) 简单算术符介绍 那什么是算术符重载呢?我们可以举个例子。一般来说,我们定义两个int类型的变量的话,我们就可应对这两个类型进行加、减、乘、除的操作,同时还能比 较判断、打印、数组操作、*号操作等等。那么如果我们想自己定义的类也具有这样的属性,那我们应该怎么办呢?当然就要算术符重载了。首先,我们对基本 class做一个定义:[cpp] view plaincopyclass 阅读全文
posted @ 2012-01-18 11:11
董雨
阅读(182)
评论(0)
推荐(0)
摘要:
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 const是C/C++语言中的关键字,但是如果用的好,可以极大地提高代码的健壮性。一般来说const使用的地方还是蛮多的,但是主要还是下面几个 地方:(1)普通变量的保护;(2)地址空间的保护;(3)类初始变量的声明和保护;(4)类变量在函数中的保护。const的保护主要来自于编译器层 面,和程序的运行没有关系。 (1)普通变量的保护[cpp] view plaincopyconstintdata=10;constcharstr='a';constdoublepi=3.14; 阅读全文
posted @ 2012-01-18 11:11
董雨
阅读(185)
评论(0)
推荐(0)
摘要:
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 看过设计模式的朋友都知道,我们在设计单件模式的时候离不开类的静态函数。和类的成员变量不同,类的静态变量属于全部类对象数据;同样和类的成员函数不 同,类的静态函数属于全部类函数共有。这句话读来想来有一些拗口,不过没有关系,我们可以通过一段代码来说明问题。 (1)静态变量 老规矩,我们首先对类进行初步定义,如下所示:[cpp] view plaincopyclassemployee{public:employee(){}~employee(){}staticintvalue;}; 那么,这里出现 阅读全文
posted @ 2012-01-18 11:10
董雨
阅读(295)
评论(0)
推荐(0)

浙公网安备 33010602011771号