随笔分类 -  编程方法

摘要:在一些大的工程中,可能会包含几十个基础类,免不了之间会互相引用 ( 不满足继承关系,而是组合关系 ) 。也就是需要互相声明。好了,这时候会带来一些混乱。如果处理得不好,会搞得一团糟,根据我的经验,简单谈谈自已的处理办法:编码时,我们一般会尽量避免 include 头文件,而是采用声明 class XXX 。 但有时候还是必须用 Include 头文件,那么,两者的划分在于什么呢?应该是很明确的,但书上好像都少有提及。首先: 我们要明白为什么要用声明取代头文件包含:对了,是为了避免无必要的重编译 ( 在头文件发生变更时 ) 。 工程较大,低速机,或基础类经常变更 ( 不合理的设计吧 ) ,编译. 阅读全文
posted @ 2010-08-10 23:51 dzqabc 阅读(1897) 评论(0) 推荐(1)
摘要:"在共享DLL中使用MFC"指的是打包时一些MFC的DLL的内容没有被硬编码到在EXE文件中,所以EXE会文件较小,但是运行时要求运行的系统环境中要有相关的DLL文件. "在静态库中使用MFC"是将DLL对应的lib静态库中的相关代码硬编码到EXE文件中,文件较大,但是可以在没有已经被包含DLL的机器上运行,当然即使如此也并非所有的DLL都会将其硬编码到Exe中,因此仍然某些DLL是必须的.比如Redistributable Package中的某些DLL. 阅读全文
posted @ 2010-07-31 15:10 dzqabc 阅读(830) 评论(0) 推荐(0)
摘要:VS2008 lib静态链接一、 静态链接库与动态链接库区别静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib 中的指令都全部被直接包含在最终生成的 EXE 文件中了。但是若使用 DLL,该 DLL 不必被包含在最终 EXE 文件中,EXE 文件执行时可以“动态”地引用和卸载这个与 EXE 独立的 DLL 文件。静态链接库和动态链接库的另外一个区别在于静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。动态库就是在需要调用其中的函数时,根据函数映射表找到该函数然后调入堆栈执行。如果在当前工程中有多处对dll文 阅读全文
posted @ 2010-07-22 17:23 dzqabc 阅读(7320) 评论(0) 推荐(2)
摘要:1:把dll的项目直接放进带有exe启动的项目,引用,调试(放在一个Workspace或者是solution中,这样应该可以连调了)2:直接启动dll项目: 项目属性的“启动操作”里把调试模式该为程序,并在“启动应用程序”栏选取exe程序。(2005中设置是项目属性->配置属性->调试->命令中指定会调用该dll的Exe程序) 这样vs.studio会先把那个exe启动起来。当然那个exe如果调用了这个dll的话,在这里设置断点就没问题了。 比如,我提供了一个exe程序,里面有一大堆的处理,其中一个需要调用xx.dll。某开发者只有xx.dll的源码,没有exe的源码,但是又 阅读全文
posted @ 2010-07-19 23:29 dzqabc 阅读(441) 评论(0) 推荐(0)
摘要:子线程中定义消息,进行消息循环 窗口多线程中倘若要使子线程能够接收并处理各种消息,则应该在子线程中增加消息循环,不断接收和处理消息,当然这样子的子线程就会像主线程一样运行,只不过处理的消息一般为自定义消息了,而本应在子线程中做的各种处理则变成了消息循环中对不同消息的处理.同时应注意添加了消息循环的子线程同窗口主线程相似,在出现对某个消息进行大量处理时将导致对后续消息处理的暂停. 消息循环: peekmessage(&msg,null,0,0,pm_remove); while(getmessage(&msg,null,0,0)) { switch(msg.message) { 阅读全文
posted @ 2010-07-04 02:48 dzqabc 阅读(1943) 评论(0) 推荐(0)
摘要:简而言之,回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数。 为什么要使用回调函数? 因为可以把调用者与被调用者分开。调用者不关心谁是被调用者,所有它需知道的,只是存在一个具有某种特定原型、某些限制条件(如返回值为int)的被调用函数。 回调函数:就是指向指针的指针,保存的就一个地址,通常用在钩子过程,异步过程调用等等,因为是一个地址,不会携带任何其他的信息所以一般的回调函数不是类型安全的. 委托就一个类,他的每个实例就是对一个方法(定义好了返回值,输入参数类型,个数以及函数调用的约定)和其. 阅读全文
posted @ 2010-03-18 23:44 dzqabc 阅读(3725) 评论(0) 推荐(0)
摘要:「System」「Local Service」「Network Service」执行程序时的区别「System」执行某些程序也会不正常 如:OpenOffice,因为system账户没有填写注册信息(由于system无用户界面所以无法进行与账户对应的用户信息的输入)所以system无法使用该软件*个人总结,仅供参考 阅读全文
posted @ 2009-12-18 10:04 dzqabc 阅读(220) 评论(0) 推荐(0)
摘要:按值传递一个参数给函数就是制作该参数的一个独立复本,即一个只存在于该函数内的复本。即使按引用传递对象和数组时,如果直接在函数中用新值覆盖原先的值,在函数外并不反映新值。只有在对象的属性或者数组的元素改变时,在函数外才可以看出。param.message = "I was changed";// 由于是新创建了对象,所以将不会在函数外反映新值,新值仅在函数内有效 阅读全文
posted @ 2009-12-14 21:41 dzqabc 阅读(264) 评论(0) 推荐(0)
摘要:◎Design Pattern: Abstract Factory 模式 我们平日走在步人街上都能看到很多专卖店,服装、珠宝等等;拿服装专卖店来说,一个专卖店里面肯定有好几个品牌的服装,比如Giordano、Baleno,这些品牌都是不同公司生产的。没人见个专卖店自己生产服装的吧,专卖店需要某个品牌的服装时,就去联系相应的厂家供货即可,具体的生产是由厂家去完成。抽象工厂模式也是如此,抽象工厂提供多个抽象方法,由具体的子工厂去实现。现在我想开一家服装店,经营上衣和短裤,至于具体什么品牌的等选门面在装修之时再定。interfaceISpecialityShop{ShirtcreateShirt(. 阅读全文
posted @ 2009-10-13 13:46 dzqabc 阅读(194) 评论(0) 推荐(0)
摘要:VC中的Just-in-time调试,使用该调试模式应用程序可以再Visual C++开发环境之外运行知道发生一个错误.当遇到一个程序错误时,Just-in-time调试自动加载Visual C++ Debugger .要打开Just-in-time调试只需要修改Tools->Options->Just-in-time debugging选项即可(其实该选项所做的操作就是写了个注册表,将自己作为其他程序抛出异常时的处理程序,下面有介绍) 设置即时调试断点,在编译生成的Debug版本程序中加入断点异常,在代码中硬编码一个断点(相当于让程序出错),让程序在到达程序员希望停止位置时加载已 阅读全文
posted @ 2009-09-18 23:08 dzqabc 阅读(3649) 评论(0) 推荐(0)
摘要:作为一个程序员在桌面检查时,必须经常考虑到输入不可能的非正常数据,确定程序走向,所以程序员应该牢记墨菲法则墨菲法则 墨菲定律(Murphy's Law),亦称莫非定律、莫非定理、或摩菲定理,是西方世界常用的俚语。墨菲定律主要内容是:事情如果有变坏的可能,不管这种可能性有多小,它总会发生。比如你衣袋里有两把钥匙,一把是你房间的,一把是汽车的,如果你现在想拿出车钥匙,会发生什么?是的,你往往是拿出了房间钥匙。 “墨菲法则”、“派金森定理”和“彼得原理”并称为二十世纪西方文化中最杰出的三大发现。溯源 墨菲定律的原话是这样说的:If there are two or more ways to 阅读全文
posted @ 2009-09-12 08:25 dzqabc 阅读(664) 评论(0) 推荐(0)
摘要:关于Debug&Release在使用VC开发软件的过程中,正当要享受那种兴奋的时候突然发现:release与debug运行结果不一致,甚至出错,而release又不方便调试,真的是当头一棒啊,可是疼归疼,问题总要解决,下面将讲述一下我的几点经验,看看是不是其中之一:1. 变量。大家都知道,debug跟release在初始化变量时所做的操作是不同的,debug是将每个字节位都赋成0xcc(注1),而release的赋值近似于随机(我想是直接从内存中分配的,没有初始化过)。这样就明确了,如果你的程序中的某个变量没被初始化就被引用,就很有可能出现异常:用作控制变量将导致流程导向不一致;用作数 阅读全文
posted @ 2009-09-07 22:38 dzqabc 阅读(1462) 评论(0) 推荐(0)
摘要:开篇十个问题问题1 作为一个c/c++程序员,你的所有子程序代码都封装在函数体内,你知道还有其他类型的子程序否(与c/c++不同,许多语言还有另外一种类型的子程序成为过程)?问题2 你是否知道过程子程序和函数子程序之间的所有区别?问题3 你是否学习过如何解析一个表达式,考虑到操作符的优先级?问题4 你是否知道属于先行EOF(look-ahead EOF)和非先行EOF(non-look-ahead)的含义?问题5 你是否知道预读(priming read)语句的含义问题6 你是否知道标记循环指的是什么?问题7 你是否知道 static(静态)键字在内层,外层以及作为一个(数据或方法)类成员的作 阅读全文
posted @ 2009-08-30 21:58 dzqabc 阅读(1935) 评论(0) 推荐(0)
摘要:利用关键代码段实现多线程同步关键代码段又叫临界区,是指一个小代码段,在代码能够执行前,它必须对具有对资源的独中权。如一次只能一个人打电话的公用电话厅,开始时要建个电话厅(初始化临界区:InitializeCriticalSection),一个人打电话(EnterCiticalSection),打完电话离开,便于别人打(LeaveCriticalSection),电话厅不用时,拆掉,释放资源(DeleteCriticalSection);如下程序实现多线程同步:#include <windows.h>#include <iostream>using namespace s 阅读全文
posted @ 2009-08-28 18:42 dzqabc 阅读(366) 评论(0) 推荐(0)
摘要:C#访问同类实例的私有成员代码大家都知道,一个类的私有成员只能在他的内部访问!但是不知道大家注意到没有,实际上在C#中一个类的实例是可以访问同一个类的另外一个实例的私有成员的。请看这段简单的代码public class MyClass { private int i = 0; public void Function() { MyClass a = new MyClass(); Console.WriteLine( a.i); //这里成功访问了另外的一个实例a的私有实例字段 } }大家也可以自己写一段类似的代码来测试一下,的确是可以访问另外一个实例的私有成员!为什么呢?因为C#就是一开始就是 阅读全文
posted @ 2009-08-25 10:22 dzqabc 阅读(314) 评论(0) 推荐(0)
摘要:奥古斯都·德·摩根首先发现了在命题逻辑中存在着下面这些关系: 非(P 且 Q)=(非 P)或(非 Q) 非(P 或 Q)=(非 P)且(非 Q)德·摩根的发现影响了乔治·布尔从事的逻辑问题代数解法的研究,这巩固了德·摩根作为该规律的发现者的地位,尽管亚里士多德也曾注意到类似现象、且这也为古希腊与中世纪的逻辑学家熟知(引自Bocheński《形式逻辑历史》 )。形式表示形式逻辑中此定律表达形式:在集合论中:[编辑] 详细解释在经典命题逻辑的外延中,此二元性依然有效(即对于任意的逻辑运算符,我们都能找他它的对偶),由于存在于调节否定关系的恒等式中, 阅读全文
posted @ 2009-08-12 15:04 dzqabc 阅读(3749) 评论(0) 推荐(0)
摘要:主要思想:将各硬件模块作为观察者加入观察者队列,当机器状态改变时Notify所有观察者,各观察者根据消息类型做不同反应或不作反应。下面贴出代码简单实现,希望引起圈内朋友的关注,起到抛砖引玉的效果。下面两个类是两个基类.class CObserver {public: CObserver(); virtual ~CObserver();public: virtual void Update(HouEvent nEvent)=0;};class CSubject{public: CSubject(); virtual ~CSubject();public: void Attach(CObserve 阅读全文
posted @ 2009-08-07 09:53 dzqabc 阅读(312) 评论(0) 推荐(0)
摘要:会用CMap了,其他的基本也就会了,很容易理解。 映射表类(CMap)是MFC集合类中的一个模板类,也称作为“字典”,就像一种只有两列的表格,一列是关键字,一列是数据项,它们是一一对应的。关键字是唯一的,给出一个关键字,映射表类会很快找到对应的数据项。映射表的查找是以哈希表的方式进行的,因此在映射表中查找数值项的速度很快。举个例子来说吧,公司的所有职员都有一个工号和自己的姓名,工号就是姓名的关键字,给出一个工号,就可以很快的找到相应的姓名。映射类最适用于需要根据关键字进行快速检索的场合。 常用CMap: CMapWordToPtr 保存void指针,关键字为WORD CMapPtrToWord 阅读全文
posted @ 2009-08-05 15:51 dzqabc 阅读(5649) 评论(1) 推荐(1)
摘要:连带路径分隔符“\”及文件名本身,最大支持259个字符(系统为XP,SP2)。事实上,所有的 Windows API 都遵循这个限制。因此,每当我们试图更改某一文件的文件名时,当输入的文件名长度 ( 全路径 )到达一定限度时,虽然文件名本身还未达到 255 个字符的限制,但是任何输入将不再被接受,这其实正是由于操作系统不允许 260个字符(byte)的文件全路径。 阅读全文
posted @ 2009-07-28 10:47 dzqabc 阅读(1675) 评论(0) 推荐(0)
摘要:VC的命名规则 一、程序风格:1、严格采用阶梯层次组织程序代码:各层次缩进的分格采用VC的缺省风格,即每层次缩进为4格,括号位于下一行。要求相匹配的大括号在同一列,对继行则要求再缩进4格。例如:2、提示信息字符串的位置在程序中需要给出的提示字符串,为了支持多种语言的开发,除了一些给调试用的临时信息外,其他所有的提示信息必须定义在资源中。3、对变量的定义,尽量位于函数的开始位置。二、命名规则:1、变量名的命名规则①、变量的命名规则要求用“匈牙利法则”。即开头字母用变量的类型,其余部分用变量的英文意思或其英文意思的缩写,尽量避免用中文的拼音,要求单词的第一个字母应大写。即: 变量名=变量类型+变量 阅读全文
posted @ 2009-07-16 12:54 dzqabc 阅读(379) 评论(0) 推荐(0)