
C++
超频化石鱼
这个作者很懒,什么都没留下…
展开
-
zlib压缩zip
使用zlib库将文件或文件夹压缩到zip中的步骤如下:1. 调用zipOpen()函数,创建一个zipFile对象2. 调用zipOpenNewFileInZip()函数,在zipFile对象中创建一个文件或文件夹,并将其设为当前文件。若创建的是文件夹,直接执行步骤4;否则执行步骤33. 读取被压缩文件的数据,调用zipWriteInFileInZip()函数,将数据原创 2018-02-07 08:29:24 · 4639 阅读 · 0 评论 -
C++产生随机数
#include #include //一定要有这个头文件#include using namespace std;//产生0-200的随机数void main() { srand(unsigned(time(NULL)));//借助系统时间初始化种子,只调用一次 int i; double RANGE_MIN = 0;//定义最小值 double RANGE_MAX原创 2018-02-05 08:24:34 · 565 阅读 · 0 评论 -
Visitor:访问者模式
已经定义了一个元素类,该类有一些成员变量。 现在希望增加一个对该类的操作。常规方法是进行派生,然后添加一个成员函数。但是这样意味着每增加一个操作,都要进行一次派生。这样随着操作数量的增加,该元素类的派生类会非常多。 于是考虑令该元素类本身固定不变,每增加一个操作,就创建一个类(访问者),该访问者类封装了对元素类的操作。当需要执行操作时,就令访问者类对象对元素类进行访问即原创 2018-02-05 08:24:28 · 195 阅读 · 0 评论 -
Strategy:策略模式
需要令某个模块(上下文)执行一个功能,但是该模块可以配置不同的算法,在不同的算法下,执行的结果也不同。 这里,算法就是策略。策略模式就是在运行时可以进行策略的更改,从而影响到执行的结果。 1. 定义策略类基类及派生类策略类基类定义了策略类的标准接口。策略类派生类实现了策略类的标准接口。策略类提供的标准接口一般是某个与Context无关的独立功能模块,比如算法原创 2018-02-05 08:24:26 · 276 阅读 · 0 评论 -
Template Method:模板方法模式
模板方法模式即提供一个抽象基类作为模板类,用户直接使用此模板类。标准模板类可以被任意派生模板类代替。于是用户每次需要不同的处理方式时,仅需要更换派生模板,而不需要对模板的调用做任何修改。 1. 抽象模板类定义抽象模板类规定了对外的标准接口及派生类需要实现的抽象接口。对于用户而言,只需要使用标准接口。 //抽象模板class AbstractClass...原创 2018-02-05 08:24:26 · 234 阅读 · 0 评论 -
State:状态模式
某个对象有一个标准接口。同时,该对象可能处于各种状态下。当该对象处于不同状态下时,客户调用标准接口,该对象会产生不同的响应。 即允许一个对象在其内部状态改变时改变它的行为,使对象看起来似乎修改了它的类。这就是状态模式。 例如,电灯开关这个对象提供了一个标准接口:按下开关。而开关可能处于关闭/打开这两种状态。当开关处于关闭状态时,调用标准接口按下开关,电灯会被打开;当开关原创 2018-02-05 08:24:21 · 292 阅读 · 0 评论 -
Prototype:原型模式
Prototype:原型模式所谓原型模式,就是可以根据一个原型,快速创建出其拷贝。如:int a = 1;int* b = new int(a);a++;cout << a << endl;cout 输出结果: 2 1上面就使用了原型模式。根据原型a,快速创建出了a的拷贝b。同时,b保存了a当时的状态。当a之后进行了修改,根据b,就可以得知当时a原创 2018-02-04 08:26:03 · 238 阅读 · 0 评论 -
Singleton:单件模式
Singleton:单件模式单件模式是一种用于确保整个应用程序中只有一个类实例且这个实例所占资源在整个应用程序中是共享时的程序设计方法(根据实际情况,可能需要几个类实例)。在某些情况下,这种程序设计方法是很有用处的。例如://.h文件class FileHelper{private: FileHelper() {}; FileHelper(const FileHelper原创 2018-02-04 08:26:16 · 238 阅读 · 0 评论 -
Proxy:代理模式
顾名思义,代理模式即在用户与工作类之间添加一个中间层,该中间层即代理类。用户与代理类进行交互,代理类再与工作类进行交互。从而达到用户间接控制工作类的情况。 类似于需要某个明星做某件事,那么直接联系其代理人,代理人会将请求传达给明星,然后明星再做这件事。 这也意味着,中间层可能有否决权,即该请求交给代理人后,代理人并不一定会传达给明星。 总之,当直接访问一个原创 2018-02-04 08:26:02 · 201 阅读 · 0 评论 -
Memento:备忘录模式
所谓备忘录模式,就是由一个专门的备忘录类来对主体的状态进行保存。当主体处于某个状态时,主体可以生成一个备忘录类对象,主体的状态就保存在该对象中。然后将该备忘录对象保存在备忘录的管理类中;当主体状态改变后,若要恢复某个指定状态,调用备忘录的管理类来获取指定的备忘录类对象,然后根据该备忘录类对象来恢复状态。 例如,游戏当中,存档就是一个备忘录类对象。当玩家需要保存进度时,根据当前...原创 2018-02-04 08:25:59 · 229 阅读 · 0 评论 -
Observer:观察者模式
很多用户的微信号都关注了腾讯官方的微信公众号。当有新的消息时,该公众号就会将信息推送给所有关注者。 这种情况下,用户微信号就是观察者,腾讯官方微信公众号就是被观察者。用户(观察者)有多个,而腾讯官方(被观察者)只有一个。 这就是观察者模式:每个观察者将自己注册给被观察者,当被观察者有新的信息时,就通知给所有的观察者。 cocos2dx的通知功能就使用了观察...原创 2018-02-04 08:25:58 · 280 阅读 · 0 评论 -
Iterator:迭代器模式
现在有一个集合。其内部元素的存储方式可能比较复杂。为了让用户在不用关心其内部表示的情况下对其元素进行访问,于是创建了一个迭代器用于对集合的各个元素进行访问。为了给用户提供一个更友好且强大的接口类,于是对迭代器以组合的形式进行封装,得到一个管理类。用户直接操作该管理类即可得到指定元素,或通过管理类直接得到迭代器,通过迭代器访问具体元素。这就是迭代器模式。 STL中使用了迭代器。以vec原创 2018-02-04 08:25:57 · 233 阅读 · 0 评论 -
Mediator:中介者模式
Mediator:中介者模式 新创建了一个QQ账号,还没有加任何好友。现在需要将一条信息发送给n个人。那么需要两个步骤:① 将所有需要接收信息的人加为好友② 依次给这些人发送信息这样非常繁琐。于是,考虑使用一个中介者,即QQ群。无需加任何好友,直接在群里发送一条信息,那么所有其他群成员都会收到。这就是中介者模式。所谓中介者,就是负责将一个成员发来的信息发送给另原创 2018-02-04 08:25:56 · 260 阅读 · 0 评论 -
Interpreter:解释器模式
解释器模式通常用于语法分析。 如果一些重复出现的问题可以用一种简单的语言来进行表达,那么就可以使用解释器模式。 解释器模式易于改变和扩展文法。易于实现一个简单的语言。 但解释器模式的效率并不高。 解释器模式的维护也非常困难。 因此,尽量不要在重要模块中使用解释器模式。在项目中,可以使用脚本语言代替解释器模式。原创 2018-02-04 08:25:52 · 217 阅读 · 0 评论 -
查找0-N之间的所有素数(质数)
最终结果不含1,若本身是素数,则含本身。std::vector _primeMap;void fillPrimeMap(int number){ _primeMap.clear(); if (number > 3) { _primeMap.push_back(2); _primeMap.push_back(3); for (int i = 4; i <= numbe原创 2018-02-05 08:24:36 · 1161 阅读 · 0 评论 -
1970年以来的秒转换为具体日期时间
输入:0时区的标准秒数输出:东8区的具体日期时间struct TimeDetail{ unsigned short day; unsigned short hour; unsigned short minute; unsigned short second;};struct DateTimeDetail{ unsigned short year; unsigned原创 2018-02-05 08:24:40 · 7387 阅读 · 0 评论 -
zlib解压缩zip
将zconf.h,zlib.h,zlibwapi.dll,zlibwapi.lib这4个文件放到项目目录下,并将头文件导入到工程中。 将zlib-1.2.8\contrib\minizip文件夹下除miniunz.c和minizip.c以外的.h与.c文件放到项目目录下,并将zip.h与unzip.h导入到工程中。 这样,就可以使用zip.h和unzip.h中的函数操作原创 2018-02-07 08:29:22 · 9682 阅读 · 2 评论 -
zlib导入到工程与数据压缩
一.将zlib导入到工程中1. 编译zlib库后,会生成一个ZlibDllRelease文件夹(Release版本)和一个ZlibDllDebug文件夹(Debug版本)。使用zlib库,共需4个文件:① zlib-1.2.8的根目录下的zconf.h和zlib.h② ZlibDllRelease文件夹下的zlibwapi.dll和zlibwapi.lib根据需要编译原创 2018-02-07 08:29:21 · 418 阅读 · 0 评论 -
zip.h解析
// 返回值#define ZIP_OK (0)#define ZIP_EOF (0)#define ZIP_ERRNO (Z_ERRNO)#define ZIP_PARAMERROR (-102)#define原创 2018-02-07 08:29:15 · 2249 阅读 · 0 评论 -
内存复制函数memcpy与内存替换函数memset
一.memcpy函数声明:void *memcpy( void* dest, const void* src, size_t count);作用是从src指向的内存地址开始,复制count个字节到dest指向的内存地址。故dest指向的内存地址必须是一片已经分配好的内存空间首地址。memcpy由于是复制内存,故可用于复制任何数据,包括int、char、结构体、类、图原创 2018-02-06 09:37:40 · 2015 阅读 · 0 评论 -
C++ win平台路径管理类
#ifndef __PATH_MANAGER_H__#define __PATH_MANAGER_H__#include #include class PathManager{public: PathManager(void) {}; PathManager(const PathManager&) {}; PathManager& operator=(const PathMan原创 2018-02-06 09:37:39 · 229 阅读 · 0 评论 -
C++ win平台文件处理类
#ifndef __FILE_HELPER_H__#define __FILE_HELPER_H__#include #include class FileHelper{private: FileHelper() {}; FileHelper(const FileHelper&) {}; FileHelper& operator=(const FileHelper &) {};原创 2018-02-06 09:37:36 · 273 阅读 · 0 评论 -
对包含的文件中出现同名函数或变量的解决方法
有两个不同的文件A.h与B.h。这两个文件中都定义了一个名为Function的函数。现在要同时使用这两个文件,于是包含了这两个文件,但是编译会出错,因为Function重定义。 但是A.h与B.h是不能修改的,这两个文件又都是必须用到的。 解决方法如下: #define Function FunctionT#include "A.h"#u原创 2018-02-06 09:37:32 · 1721 阅读 · 0 评论 -
typedef用法与函数指针别名
typedef声明,简称typedef,为现有类型创建一个新的名字,或称为类型别名。typedef不仅可以为变量定义别名,可以为struct定义别名,还可以为函数指针定义别名。一.为变量定义别名typedef int size;这样就为int定义了别名size。该用法很常见且比较简单特殊地,当使用typedef为数组定义别名时: typ原创 2018-02-06 09:37:28 · 5513 阅读 · 4 评论 -
template模板:泛型化编程
一.在函数中使用模板:template typename形参1,typename形参2>int compare(const形参1&a,const形参2&b);类格式为:template class YuTest{public: 形参1 GetNum(); ……}注意:1.每个模板形参都必须有关键字typename或class来修饰。不可以漏写。如:原创 2018-02-06 09:37:24 · 540 阅读 · 0 评论 -
enum枚举变量的用法
Class Piece{public: typedef enum { colorless,white,black } pieceColor; enum pieceColor { colorless,white,black };//首先声明一种枚举型变量,该变量的类型名为pieceColor。上面这两种方法均可,建议使用第一种方法 pieceColor m_color;//然后用该类型来定原创 2018-02-06 09:37:22 · 10272 阅读 · 0 评论 -
dynamic_cast:安全转换
上行转换:子类指针转父类指针下行转换:父类指针转子类指针上行转换一定是安全的。即由子类指针转为父类指针。下行转换可能会有问题。1. 对于上图,A是父类:① A*转B*:下行转换,使用dynamic_cast会得到null即定义一个对象A*,然后使用dynamic_cast将其转换为B*。下同。② B*转A*:上行转换,使用dynamic_cast会得到原创 2018-02-06 09:37:19 · 962 阅读 · 0 评论 -
delete一个void*指针:不调用析构函数
一个类对象,当生命周期结束时,该对象会调用自身的析构函数。 一个类的指针,当使用delete函数来删除该指针时,会调用该指针当前类型的析构函数。 比如:classB* pClass = (classB*)new classA;delete pClass; 尽管该指针实际上是classA*类型,但将其转换为classB*类型,那么delete时,调原创 2018-02-06 09:37:17 · 2548 阅读 · 0 评论 -
C++无穷的表示
在C++中,有时候会遇到无穷的情形。如何表示无穷?首先,C++每种数据类型都有固定的位数,从而可以用数值位全1来表示最大数据。C++本身也定义了一些这样的常量来供使用。如最大无符号整型数据是UCHAR_MAX,十进制数为255,1十六进制数为0xff;最大double数据是DBL_MAX,等,无需包含头文件即可调用,在MSDN中可以查到。但是,最大数据只是最大,依然不是无穷。在VS中,为了原创 2018-02-05 08:24:41 · 9439 阅读 · 2 评论 -
Factory:工厂模式
工厂模式有3种。以下的示例代码都省略了构造函数与析构函数。一. 简单工厂模式简单工厂模式就是只有一个工厂,所有的产品都有该工厂生产。每一种产品都有一个对应的type。当需要某种产品时,将该产品的type传给工厂,然后工厂即会返回该产品。这样意味着工厂内部必须针对type作判断,也就是使用一个switch语句来根据传入的type,决定创建哪一种产品。当产品种类很多时,这个sw原创 2018-02-04 08:25:45 · 211 阅读 · 0 评论 -
Flyweight:享元模式
享元模式可以避免大量且相似的开销。 例如,停车场中有1000辆车,那么需要创建1000个对象。这样开销是非常大的。 设这1000辆车中,Tesla有300辆,BMW有700辆。以Tesla为例,300辆Tesla的基本属性都相同,仅仅是颜色不同,那么就考虑创建一个Tesla基础对象,然后300辆Tesla共享这一个对象,仅根据颜色不同进行各自的处理。如,1号停车原创 2018-02-04 08:25:45 · 239 阅读 · 0 评论 -
STL:map
#首先包含头文件:#include using namespacestd;//需要使用该命名空间 #然后定义对象:mapint,CString>m_student;//int为学号,CString为姓名map中包含两个值,即key,value>。key是指关键字,用于索引;value是指所求的值。其中,key是唯一的,在同一个map对象中不可能出现两个key值相同的原创 2018-02-02 08:39:32 · 225 阅读 · 0 评论 -
STL:list
#首先包含头文件:#include using namespace std;//需要使用该命名空间list是一个双向链表,是不支持随机存取的。 #然后定义对象:listint> m_list;定义一个int型的双向list链表。 #输入元素:m_list.push_back(8);m_list.push_back(9);m_list.pu原创 2018-02-02 08:39:23 · 172 阅读 · 0 评论 -
STL:vectoer
#首先包含头文件:#include using namespace std;//需要使用该命名空间 #然后定义对象:vectorint> m_steps; #向对象中添加数据:m_steps.push_back(123);vector.push_back的对象所属类一定是要实现了拷贝构造函数以及”=”运算符重载的当将某些自定义类的对象push_back出原创 2018-02-01 15:00:34 · 514 阅读 · 0 评论 -
dynamic_cast与 static _cast:类的上下行转换
A为基类,B为派生类。现在定义: A* pA; B* pB;一般来说,pB可以转换为pA,(把派生类的指针或引用转换成基类表示),称之为上行转换。但反之一般是不行的,也就是将pA转换为pB,(把基类指针或引用转换成派生类表示),称之为下行转换。这种行为直接用(*类名)的方式来进行是错误的。然而,下行转换并非绝对不可以。要进行下行转换,需原创 2018-02-01 08:31:34 · 3999 阅读 · 1 评论 -
拷贝构造函数以及类内直接调用同类对象私有成员变量
拷贝构造函数写法:声明:class CYuStatic{public: CYuStatic(const CYuStatic&srcStatic);//拷贝构造函数private: CFont m_font; bool m_bBKTransparent;//背景是否透明 COLORREF m_fontColor;//字体颜原创 2018-01-31 09:29:07 · 841 阅读 · 0 评论 -
在类内调用自身拷贝构造函数陷阱:0xcccccccc
在类内调用自身拷贝构造函数是个陷阱,一般情况下不会达到初始化自身的目的。 如: class CTest { public: CTest(void); ~CTest(void); CTest(const CT原创 2018-01-31 09:32:03 · 283 阅读 · 0 评论 -
结构体的构造函数、函数及=运算符
struct GLColor{ GLfloat r; GLfloat g; GLfloat b; GLColor():r(0),g(0),b(0){}//默认构造函数 GLColor(GLfloat rValue,GLfloat gValue,GLfloat bValue)//构造函数原创 2018-01-31 09:26:48 · 374 阅读 · 0 评论 -
构造函数与析构函数以及virtual
构造函数一定不可以为虚函数。A->B //A为基类,派生了BA的析构函数为~A();B的析构函数为~B();现在定义了一个B对象。若A的析构函数不为virtual,则B析构时,调用的是基类A的析构函数~A(),尽管B显式定义了自己的析构函数~B()。若A的析构函数为virtual,则B析构时,先调用B的析构函数~B(),再调用基类A的析构函数~A()。 其原创 2018-01-31 09:23:23 · 486 阅读 · 1 评论 -
构造函数调用顺序及初始化列表
设有3个类A、B、C,其中A派生B,B派生C。 即:C-> B-> A 定义一个C对象,则:① 进入C对象的构造函数② 检查C构造函数的初始化列表,看其中是否手动调用基类B构造函数。无论是否手动,都立即调用基类B构造函数。不同的是手动调用时,可以为B构造函数传参③ 进入B构造函数④ 检查B构造函数的初始化列表,看其中是否手动调用基原创 2018-01-31 09:18:46 · 675 阅读 · 0 评论