- 博客(50)
- 资源 (3)
- 收藏
- 关注
原创 Facade模式(外观模式)
Facade模式也叫外观模式,是由GoF提出的23种设计模式中的一种。Facade模式为一组具有类似功能的类群,比如类库,子系统等等,提供一个一致的简单的界面。这个一致的简单的界面被称作facade。 本文介绍设计模式中的外观(Facade)模式的概念,用法,以及实际应用中怎么样使用Facade模式进行开发。Facade模式的概念Facade模式为一组具有类似功能的
2009-08-30 23:34:00 952
原创 变长数据结构
struct dirent{..............char a[1];}在这里char a[1];长度为1,一般认为作为字符数组只能存放/0,但在这里a[1]声明是放在结构体的最后,属于变长数据结构的使用,能够方便访问结构体后面的地址,如:[Copy to clipboard] [ - ]CODE: struct dirent{ int len; char a[0];};
2009-08-28 21:50:00 2146
原创 union 联合体的测试
一直以来很像tcp一样,做可变长的网络数据包,为此自己写了一些很有意思的测试代码,想了解联合体的朋友,不妨从我这里拷过去自己亲自调试调试。#include #include #include struct Msg_t{ char a; int b; int c;};struct Msg_b{ char a; char b; char c; char d;};struct stU{ in
2009-08-28 19:42:00 868
原创 联合的使用
联合用法举例; struct table { int pp; char tt[20]; }; struct list { char name; char password; }; struct All { int
2009-08-28 19:24:00 693
原创 ENUM在结构体中占用空间吗(2)
写了上面一篇后,仍然意犹未尽,想测试下函数,虚函数,当然,从书本上我早知道普通函数不占结构体空间,虚函数有个虚函数指针占四个自己的空间。但是我都是从书本上看到的,一直以来没有真正去测试过。 #include #include #include struct Msg{ enum { TAG_SIZE = 3}; enum { TAG_ID = 5, TAG_ID_1, TAG_ID_2, T
2009-08-28 16:21:00 1663
原创 ENUM在结构体中占用空间吗
今天在调试网络问题时,突然想到了动态数据包,要用到enum来区分不同的数据包。此时想到一个问题"ENUM在结构体中占用空间吗" 于是我写了段代码测试了一下struct Msg{ enum { TAG_SIZE = 3}; enum { TAG_ID = 5, TAG_ID_1, TAG_ID_2, TAG_ID_3}; int a; int b;};void main(){
2009-08-28 16:03:00 5039 6
原创 一个非常有用的调试技巧
其意尽在代码之中 #include void main(){ int a = 6; int b = 0; try { a = a/b; } catch(...) { _asm { int 3 } } }
2009-08-24 19:16:00 779
原创 明智地使用私有继承
明智地使用私有继承条款35说明,C++将公有继承视为 "是一个" 的关系。它是通过这个例子来证实的:假如某个类层次结构中,Student类从Person类公有继承,为了使某个函数成功调用,编译器可以在必要时隐式地将Student转换为Person。这个例子很值得再看一遍,只是现在,公有继承换成了私有继承:class Person { ... };class Student:
2009-08-24 18:45:00 584
原创 初始化类对象
C++中如何初始化类中的表数据?在C语言中,我能像下面这样初始化结构数组: //struct MYSTRUCT { int x,y,z;};MYSTRUCT table[] = { { 1,2,3 }, { 4,5,6 }, ... // etc};//但是如果MYSTRUCT是个C++类,
2009-08-24 15:20:00 578
原创 CSocket 是如何被封装的
CAsyncSocket 看类名就知道,它是一个异步非阻塞Socket封装类,CAsyncSocket::Create()有一个参数指明了你想要处理哪些Socket事件,你关心的事件被指定以后,这个Socket默认就被用作了异步方式。那么CAsyncSocket内部到底是如何将事件交给你的呢? CAsyncSocket的Create()函数,除了创建了一个SOCKET以外,还创建了个CSocket
2009-08-21 02:36:00 963
原创 解决两个类互为成员的问题
class CB; class CA { CB * m_pB; }; class CB { CA m_pA; } 关键有两点: 1)其中的一个类需要提前声明(forward declaration); 被提前声明的类在其被具体定义之前只能声明该类的指针或引用,如上面class A定义中只能声明class B的指针(或引
2009-08-20 22:22:00 1605
原创 用更快捷和更高效的方式创建类
例如我们有一个MyServer的工程,在ClassView中可以看到MyServer classes鼠标右键单击此处,弹出New Class对话框,在Name处添上类名,选择Class typeMFC Class表示从MFC类库派生,可以在Base class中选择父类。Form Class表示从CDialog派生的类,可以在Dialog ID中选择对话框资源IDGeneric Class表示从其
2009-08-20 22:18:00 539
原创 虚基类的构造
如果一个类有多个基类,基类的构造函数在继承类的构造函数之前被调用。基类的构造函数以被声明的顺序被调用。下面是一个例子: class Y {...} class X : public Y {...} X one; 构造函数的调用顺序是下面的顺序: Y(); // 基类的构造函数 X(); // 继承类的构造函数 对于多基类的情况,下面是一个例子: class X : publ
2009-08-20 22:12:00 815
原创 通过指针调用函数?
当你通过一个指针调用函数时,不要以为它是个指针就害怕,你就把它当成是一个不折不扣的函数名即可。例如:#include char buff[10];void (*pf) (char *, const char *);pf = strcpy; // 取strcpy的地址pf(buff, "hi"); // 象使用函数名本身一样使用指针 pf
2009-08-20 22:08:00 741
原创 全局对象在“程序开始时”建立一次,在“程序终止时”销毁一次
#include struct Foo{ Foo() { printf("before main()/n"); } ~Foo() { printf("after main()/n"); }};Foo smallFoo;int main(int argc, char* argv[]){ std::cout return 0;}
2009-08-20 22:07:00 683
原创 标准库函数计算时间
依赖标准库函数,代码不存在操作系统的兼容性问题,以及类似Feb29 或 Y2K 的Bugs 如果想要比较两个日期,可使用difftime(): #include time_t now = time(0); // 获得当前时间time_t yestderday = now-(24*60*60);double diff_in_sec = difftime(now, yesterday);
2009-08-20 21:49:00 544
原创 如何获取随机数
//先调用它 srand( (unsigned)time( NULL ) ); //随机数计时开始 然后调用 GetRand(float MIN, float MAX) { float max; max=RAND_MAX; return (int)(rand()*(MAX-MIN)/max+MIN); } 其
2009-08-20 21:47:00 690
原创 如何得到当前时间日期
一、使用MFC可以用以下代码得到CTime time = CTime::GetCurrentTime(); ///构造CTime对象int m_nYear = time.GetYear(); ///年int m_nMonth = time.GetMonth(); ///月int m_nDay = time.GetDay(); ///日int m_nHour = t
2009-08-20 21:36:00 658
原创 C++编码中减少内存缺陷的方法和工具
C++语言是桌面系统,尤其是系统软件、大型应用软件的主流开发语言。C++语言以其灵活性著称,同时也更复杂。利用C++编写健壮的代码,更具有挑战性。C++允许动态内存管理, 同时也容易导致更多和内存相关的问题。一般而言, 除了系统设计上的缺陷, 基于C++的软件的缺陷和错误大部分都和内存缺陷(主要包括内存访问错误和内存泄漏两类)相关。 所以,消除代码中的内存相关缺陷,成为程序员编写、调试、维护代码中
2009-08-20 21:32:00 1038
原创 数据代码地址分布
大家可以运行这段代码,我相信足以让你明白 #include #include const int i = 10; //文本常量区 int j = 10; //初始化全局区 int n; // 未初始化全局区 char *p = "test"; // "test"在文本常量区,指针自身在初始化全局区 int main() { char *p1 = "H
2009-08-20 17:08:00 661
原创 模态对话框分析(1)
在Windows操作系统中,面向用户的GUI基本上可分为对话框形式和文档/视图两种表现形式。对话框的显示方式又可分为模态对话框和非模态对话框,以适应不同的用户交互需求。由于对话框和文档/视图框架结构各有特色,能不能将文档/视图框架结构当作一对话框来使用,或在对话框中实现文档/视图框架结构内的特色功能呢,答案是肯定的。 下面,从Windows 操作系统消息驱动机制开始,进而探讨模态对话框实现过程的
2009-08-20 14:09:00 662
原创 doc/view/frame之间的关系系列文章(1)
一直以来我没有系统的把23种设计模式一口气看完,总是用到时上网查一查。没来得及去思考,总结这23种设计模式,于是在理解mfc框架时总是不能得心应手,实在是痛苦不堪。今天在研究麻将时,建立一个sdi的工程,于是把这个框架粗略的研究了一番。 大致有下面这些心得:建立SDI向导的过程中,vc6.0为我们做了下面这些事情:1.new了DOC,FRAME,VIEW三个对象2.创建了
2009-08-19 19:11:00 1166
原创 STL容器总结系列(1)
一、容器作为STL的最主要组成部分--容器,分为向量(vector),双端队列(deque),表(list),队列(queue),堆栈(stack),集合(set),多重集合(multiset),映射(map),多重映射(multimap)。以下顺序按照:容器特性所在头文件进行。向量vector可以用常数时间访问和修改任意元素,在序列尾部进行插入和删除时,具有常数时间复杂度,对任意项的
2009-08-19 17:01:00 1400 1
原创 CSocket的listen()函数做了哪些事情
微软把bsd socket封装的很完美,实现网络编程服务端,仅仅几个步骤首先Create(端口号),接着Listen(允许接入的客户个数)那么Listen这个函数做了哪些事情呢?1. getaddr得到地址信息2. socket建立socket3. bind帮定到socket上4. 创建一个线程,listen开始监听5. 将socket交给主thread去处理
2009-08-19 15:46:00 2033
原创 Loadlibrary 失败的原因
今天调试公司的游戏程序时,发现Loadlibrary总是调用失败,查看加载的动态库路径完全正确,为什么还是会加载失败呢?莫非是这个被加载的动态库本身有问题,我用工具查看了其依赖性,发现没问题,难道是该动态库依赖的动态库有问题?我继续查看该动态库依赖的动态库依赖性果然是这样。
2009-08-18 14:31:00 2362
原创 ini文件动态配置程序参数
#include #include #include #define WOM_WOMCLTMD_INI "E://work//vctest//testmjong//womcltmd.ini"int main(void){ unsigned int func_rtn; char StrBuf[256]; char work[256]; memset(StrBuf, /0, siz
2009-08-16 23:07:00 854
原创 assert 配合#粘连符号调试程序
#include #include #define mack(x) #xint main(int argc, char* argv[]){ assert(!mack(abc)); return 0;}
2009-08-16 22:21:00 446
原创 宏的妙用系列(1)
1、概述 C++中出了const关键字以后,宏定义常量的功能已经不在被推荐使用。这使得宏似乎没有了用武之地。实际上,宏还可以做很多事情,笔者也难以全部列举。这里,仅仅列举几个典型的用法,希望大家能够从中获益。 2、实现多环境兼容 常见的情况是,我们实现了一个函数,希望它只在某种编译条件满足是被编译和使用。例如,我希望在源码中插入调试语句,以便以Debug方式运行时能够通过调试信息观察程序运行情
2009-08-16 22:08:00 465
原创 麻将洗牌算法系列(1)
1,首先定义数组paiqiang[136](就是所有的牌)。 2,设置随机种子 3,这样就把136张牌洗乱了 for(i=0;i { r=rand()%(136-i); t=paiqiang[136-i-1]; paiqiang[136-i-1]=paiqiang[r]; paiqiang[r]=t; } 正在研究更好的算法,这个算法虽然避免了计算机出现相同随机数的情况,但是很有可
2009-08-16 22:00:00 3016
原创 几个少见的宏以及其作用
__LINE__返回源程序中当前的行号。 __FILE__返回当前源文件名。__DATE__ 返回当前时间。 可以尝试把我这段代码拷贝我去调试看看结果,加深下印象:#include int main(int argc, char* argv[]){ cout cout cout return 0;} 知道这几个宏的意思,那么下面讲讲其作用,当我们调试程序时想
2009-08-16 21:32:00 520
原创 麻将胡牌算法系列(一)
#include int Hu(int PAI[38]);int Remain(int PAI[38]);int main(){ // °ÑÒ»¸±ÅÆ·ÅÔÚÏÂÃæµÄÊý×éÀ¿ÉÒÔÈÎÒâÌîÈëÊý×ÖÀ´²âÊÔº¯ÊýÕýÈ·Óë·ñ¡£ // ΪÁË·½±ã£¬PAI[0],PAI[10],PAI[20],PAI[30]¶¼ÆúÖ®²»Ó㬲¢ÇÒ
2009-08-16 20:36:00 3839
原创 麻将和牌牌型
和牌的基本牌型 11、123、123、123、123。 11、123、123、123、111(1111,下同)。 11、123、123、111、111。 11、123、111、111、111。 11、111、111、111、111。 和牌的特殊牌型 11、11、11、11、11、11、11(七对)。 1
2009-08-16 16:53:00 2578
原创 麻将中的牌类
字牌:东、南、西、北、中、发、白花牌: 梅、兰、竹、菊、春、夏、秋、冬刻字:三张一样顺子:同色三张组成一个序列杠牌:四个一样的牌刻子: 三张相同的牌,万、索、饼和字牌均可凑成将牌:两张相同的牌,万、索、饼和字牌均可凑成,胡牌时必须要有一付“将牌”十三幺:一九饼,一九万,一九条,6张,加东南西北中发白,7张,成听牌,要想胡只要再摸到东南西北中发
2009-08-14 20:49:00 1636
原创 创建modeless对话框
void CTestDlgDlg::OnCreateWindow() { // TODO: Add your control notification handler code here CMyDialog *pDialog = NULL; pDialog = new CMyDialog(); pDialog->Create(IDD_DIALOG, this); if ( NULL !
2009-08-14 19:31:00 556
原创 AFX_MANAGE_STATE(AfxGetStaticModuleState()) 作用
以前写MFC的DLL的时候,总会在自动生成的代码框架里看到提示,需要在每一个输出的函数开始添加上AFX_MANAGE_STATE(AfxGetStaticModuleState())。一直不明白这样做的含义,也一直没有这样做,而且代码也工作得好好的,所以感觉这好像一句废话。最近的项目中,需要在DLL里使用MFC生成界面,这才发现一旦资源放在不同的动态库里,而且还和多线程搅和在一起的时候,事情就变得
2009-08-14 16:19:00 2636
原创 DLL的导出方法(一)
DLL可以使用两种方法将公共符号导入到应用程序中或从 DLL 导出函数:生成 DLL 时使用模块定义 (.DEF) 文件。 在主应用程序的函数定义中使用 __declspec(dllimport) 或 __declspec(dllexport) 关键字。 使用 .DEF 文件模块定义 (.DEF) 文件是包含一个或多个描述各种 DLL 属性的 Module 语句的文本文件。
2009-08-13 19:55:00 2025
原创 C函数: va_start() 和 va_end()
1:当无法列出传递函数的所有实参的类型和数目时,可用省略号指定参数表void foo(...);void foo(parm_list,...);2:函数参数的传递原理函数参数是以数据结构:栈的形式存取,从右至左入栈.eg:#include void fun(int a, ...) { int *temp = &a; temp++; for (int i = 0; i { cout temp+
2009-08-11 20:19:00 861
原创 vsprintf 用法
函数名: vsprintf 功 能: 送格式化输出到串中 用 法: int vsprintf(char *string, char *format, va_list param); 程序例: #include #include #include char buffer[80]; int vspf(char *fmt, ...) { va_list argptr; int cn
2009-08-11 17:03:00 4700 1
原创 basic_string &assign 的使用
赋值(assign) 语法: basic_string &assign( const basic_string &str ); basic_string &assign( const char *str ); basic_string &assign( const char *str, size_type num ); basic_string &assign( const basic_
2009-08-11 16:52:00 1736
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人