随笔分类 - C++
摘要:问题个人认为 Singleton 模式是设计模式中最为简单、最为常见、最容易实现,也是最应该熟悉和掌握的模式。且不说公司企业在招聘的时候为了考察员工对设计的了解和把握,考的最多的就是 Singleton 模式。Singleton 模式解决问题十分常见,我们怎样去创建一个唯一的变量(对象?在基于对象的设计中我们可以通过创建一个全局变量(对象)来实现,在面向对象和面向过程结合的设计范式(如 C++中)中,我们也还是可以通过一个全局变量实现这一点。但是当我们遇到了纯粹的面向对象范式中,这一点可能就只能是通过 Singleton 模式来实现了,可能这也正是很多公司在招聘 Java 开发人员时候经常考
阅读全文
摘要: 问题 假设我们要开发一款游戏,当然为了吸引更多的人玩,游戏难度不能太大(让大家都没有信心了,估计游戏也就没有前途了),但是也不能太简单(没有挑战性也不符合玩家的心理)。于是我们就可以采用这样一种处理策略:为游戏设立等级,初级、中级、高级甚至有BT 级。假设也是过关的游戏,每个关卡都有一些怪物(monster)守着,玩家要把这些怪物干掉才可以过关。作为开发者,我们就不得不创建怪物的类,然后初级怪物、中级怪物等都继承自怪物类(当然不同种类的则需要另创建类,但是模式相同)。在每个关卡,我们都要创建怪物的实例,例如初级就创建初级怪物(有很多种类)、中级创建中级怪物等。可以想象在这个系统中,将会有成
阅读全文
摘要:Simple Factory模式经常在系统开发中用到,但是这并不是 Factory 模式的最大威力所在(因为这可以通过其他方式解决这个问题)。Factory模式不单是提供了创建对象的接口,其最重要的是延迟了子类的实例化。Factory模式的应用并不是只是为了封装对象的创建,而是要把对象的创建放到子类中实现:Factory 中只是提供了对象创建的接口,其实现将放在 Factory 的子类ConcreteFactory中进行。优点Factory 模式在实际开发中应用非常广泛,面向对象的系统经常面临着对象创建问题:要创建的类实在是太多了。而 Factory 提供的创建对象的接口封装(第一个功能),以
阅读全文
摘要:工厂模式简单工厂(Simple Factory)模式:又称静态工厂方法(Static Factory Method)模式工厂方法(Factory Method)模式:又称多态性工厂(Polymorphic Factory)模式抽象工厂(Abstract Factory)模式:又称工具箱(Kit 或 Toolkit)模式从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(StaticFactory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂
阅读全文
摘要:exit(0):正常运行程序并退出程序;exit(1):非正常运行导致退出程序;return():返回函数,若在主函数中,则会退出函数并返回一值。详细说:1.return返回函数值,是关键字;exit是一个函数。2.return是语言级别的,它表示了调用堆栈的返回;而exit是系统调用级别的,它表示了一个进程的结束。3.return是函数的退出(返回);exit是进程的退出。4.return是C语言提供的,exit是操作系统提供的(或者函数库中给出的)。5.return用于结束一个函数的执行,将函数的执行信息传出个其他调用函数使用;exit函数是退出应用程序,删除进程使用的内存空间,并将应用程
阅读全文
摘要:typedef unsigned char byte;void fuckme(byte& byValue); // 其他人的接口// 我现在来调用const byte byValue = 11;fuckme(byValue); // 编译错误fuckme(const_cast<byte>(byValue)); // 编译错误fuckme(reinterpret_cast<byte>(byValue)); // 编译错误fuckme((byte)(byValue)); // vs2008下通过,gcc编译错误找到了两篇介绍的文章:强制转换和引用参数的问题C++函数
阅读全文
摘要:上次遇到没看懂, 今天去 c瓜哥 哪里看到这个, 搬过来存起来看到一段很奇怪的代码 cx = ((bm.bmWidth + 31) & (~31)) >> 3,bmWidth是位图行的实际存储宽度(单色位图,1个像素用1位表示),单位是位(bit),cx单位是字节。Google了很久才知道这是为了取得位图在硬盘中存储的宽度值的。实际上,为了提高位图的处理速度,DIB位图规定每行像素数据的字节数必须是4的倍数,即32位(也就是一个32位机的字长),不足时在后面(通常用0)补齐。注意,这是无关于位图的像素位数的!再回到之前那段代码上来,求行的存储宽度,其实就需要对实际像素宽度直
阅读全文
摘要:// szStartAppPath : 点击后启动的程序// szAddCmdLine : 传给main函数的lpCmdLine// szDestLnkPath : 快捷方式的保存路径// szIconPath : 快捷方式显示的图标#ifdef _UNICODE typedef wstring tstring;#else typedef string tstring;#endifbool CreateLinkFile(LPCTSTR szStartAppPath,LPCTSTR szAddCmdLine,LPCTSTR szDestLnkPath,LPCTSTR szIconPa...
阅读全文
摘要:#include #include #include HINSTANCE hInst;#pragma comment(lib,"Msimg32.lib")extern "C"{ extern unsigned char *stbi_load_from_memory(unsigned char ...
阅读全文
摘要:在帖子如何判断一个C++对象是否在堆栈上中, 又有人提出如何判断一个C++对象是否在堆上。其实我们可以参照那个帖子的方法类似实现,我们知道堆就是Heap,在windows上我们可以通过GetProcessHeaps来得到所有的堆句柄,而我们这里只要知道Windows上的Heap Handle,其实就是堆的起始地址,就可以写如下代码了。#include <iostream>#include <windows.h>using namespace std;BOOL IsObjectOnHeap(LPVOID pObject){ BOOL bRet(FALSE); DWORD
阅读全文
摘要:在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。自由存储区,就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。全局/静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化
阅读全文
摘要:typedef和#define的用法与区别一、typedef的用法在C/C++语言中,typedef常用来定义一个标识符及关键字的别名,它是语言编译过程的一部分,但它并不实际分配内存空间,实例像:typedef int INT;typedef int ARRAY[10];typedef (int*) pINT;typedef可以增强程序的可读性,以及标识符的灵活性,但它也有“非直观性”等缺点。二、#define的用法#define为一宏定义语句,通常用它来定义常量(包括无参量与带参量),以及用来实现那些“表面似和善、背后一长串”的宏,它本身并不在编译过程中进行,而是在这之前(预处理过程)就已经
阅读全文
摘要:JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。 易于人阅读和编写。同时也易于机器解析和生成。 它基于JavaScript Programming Language,Standard ECMA-262 3rd Edition - December 1999的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。 这些特性使JSON成为理想的数据交换语言。JSON建构于两种结构:“名称/值”对的集合(A collection
阅读全文
摘要:Windows Registry Editor Version 5.00[HKEY_CLASSES_ROOT\*\shell\runas]@="管理员取得所有权""NoWorkingDirectory"=""[HKEY_CLASSES_ROOT\*\shell\runas\command]@="cmd.exe /c takeown /f \"%1\" && icacls \"%1\" /grant administrators:F""Isolated
阅读全文
摘要:由于给类加了些东西结果,出现了大问题: 析构函数调用完后出错, 百思不得其解, 最后想到这个问题, 搜索了一下:以下文字引用自http://hi.baidu.com/huhe/blog/item/0b422edd1f1563d98c1029a3.html很感谢作者的分析一个模块一个堆,一个线程一个栈。dll里malloc的内存,在exe里free会出错。CRT(C运行时期库)不是使用进程缺省的堆来实现malloc(new中调用malloc)的,而是使用一个全局句柄HANDLE _crtheap来分配内存的。这个_crtheap是在XXXCRTStartUp(CRT提供的进口点函数)中创建的。
阅读全文
摘要:原始位图, 由于不能传bmp文件, 都转换成了jpg:处理后效果图:直接代码:// test1.cpp : Defines the entry point for the application.//#include "stdafx.h"#include "test1.h"#include <WindowsX.h>#define MAX_LOADSTRING 100// Global Variables:HINSTANCE hInst; // current instanceTCHAR szTitle[MAX_LOADSTRING]...
阅读全文
摘要:#include <iostream>#include <cstdarg>using namespace std;typedef int (*PCALLBACK)(int nCount,va_list vlist);int addInt(int nCount,va_list vlist){ int sum = 0; for (int i=0;i<nCount;i++) { sum+=va_arg(vlist,int); } return sum;}void func(PCALLBACK pCall,int nCount,...){ va_lis...
阅读全文
摘要:#include <iostream>#include <windows.h>#include <tchar.h>#include <commctrl.h>using namespace std;int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]){ int nRetCode = 0; SIZE_T len = 256; TCHAR * ptb = new TCHAR[256]; TCHAR * buf = new TCHAR[256]; SIZE_T size; HWND hwnd = FindW
阅读全文
摘要:定义了调用操作符的类,其对象常称为函数对象,即它们是行为类似函数的对象。可以为类类型的对象重载函数调用操作符。一般为表示操作的类重载调用操作符。函数调用操作符必须声明为成员函数。一个类可以定义函数调用操作符的多个版本,由形参的数目或类型加以区别。例如,可以定义名为 absInt 的结构,该结构封装将 int 类型的值转换为绝对值的操作:class absInt{public: int operator() (int val) { return val < 0 ? -val : val; }};貌似什么的例子没什么吸引力, 下面来个例子.比如我们有个存储字符...
阅读全文
摘要:首先在介绍可变参数表函数的设计之前,我们先来介绍一下最经典的可变参数表printf函数的实现原理。一、printf函数的实现原理在C/C++中,对函数参数的扫描是从后向前的。C/C++的函数参数是通过压入堆栈的方式来给函数传参数的(堆栈是一种先进后出的数据结构),最先压入的参数最后出来,在计算机的内存中,数据有2块,一块是堆,一块是栈(函数参数及局部变量在这里),而栈是从内存的高地址向低地址生长的,控制生长的就是堆栈指针了,最先压入的参数是在最上面,就是说在所有参数的最后面,最后压入的参数在最下面,结构上看起来是第一个,所以最后压入的参数总是能够被函数找到,因为它就在堆栈指针的上方。print
阅读全文