dll 导出的类遇到 error LNK2019 的解决方法 今天在VS2010环境下写了一个测试程序用来测试类的导出,DLL头文件如下:#if defined(CHAPTER2LIBRARY_EXPORT) // inside DLL# define CHAPTER2API __declspec(dllexport)#else // outside DLL# define CHAPTER2API __declspec
IE调用Activex控件时EVENT的三种调用方式 Test 1 uses the "for" tag to setup the callback to the activeX event. This is successful on all versions IE8, 9, 10 and 11. TestEvent Example HTML
关于TCP和和UDP包的大小 UDP一次发送数据包的大小,TCP一次发送数据包的大小。MTU最大传输单元,这个最大传输单元实际上和链路层协议有着密切的关系,EthernetII帧的结构DMAC+SMAC+Type+Data+CRC由于以太网传输电气方面的限制,每个以太网帧都有最小的大小64bytes最大不能超过1518bytes,对于小于或者大于这个限制的以太网帧我们都可以视之为错误的数据帧,一般的以太网转发设备会丢弃这些
nafxcwd.lib(afxmem.obj) : error LNK2005 近日在VC6.0写一个程序,编译时出如下错误Linking...nafxcwd.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete(void *)" (??3@YAXPAX@Z) already defined in LIBCMTD.lib(dbgdel.obj)Debug/ShowLog.exe : fatal
关于UDP通信中的10045错误 在做UDP通信的过程中,服务器端绑定IP和PORT: m_stLocalAddr.sin_family = AF_INET; m_stLocalAddr.sin_addr.s_addr = htonl(INADDR_ANY); m_stLocalAddr.sin_port = htons( 6000); m_hSocket = socket( PF_INET
VC++中#import的使用 #import 指令1. C++中使用 COM 簡單的方法是用 #import 導入 type library2. # import 指令將 COM 產生對應的 C++類別,可以用接近於VBScript和Visual Basic的語句操作 COM3. 使用 #import 命令就可以將該文件導入到我們的程式碼中。type library 的內容將被轉換為描述了 COM Interface
MFC和模块状态 什么是模块状态? 在每个使用了Microsoft Foundation Classes (MFC)的模块(EXE,DLL)中,都存在一种“全局”数据,MFC正是依靠这种全局数据才能执行正确的操作。这种全局数据就叫做MFC 模块状态。 例如,MFC应用程序经常使用下面的代码从资源文件中加载字符串: CString str;
用VC写DLL中"error LNK2005: _DllMain@12 already defined"的应对 用Visual C++编写DLL,如果在new project时选了MFC DLL,而后又想写成Regular DLL,即拥有自己的DllMain()入口函数,则在build时会遇到类似如下的link错误: error LNK2005: _DllMain@12 already defined in xxx.OBJ几种解决方案:1, 你只需要在工程设置里面,把WIN32,NDEBUG
读《大话设计模式》---观察者模式(Observer) 观察者模式(Observer)又叫发布-订阅(Public/Subscribe)模式.观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。观察者模式的结构图 观察者模式一般实现:// Observer.cpp : Defines the entry point f
VC下生成汇编代码的方法: 生成汇编代码的方法: debug方式下: vc8 下面是: Project- > ...Properties - > C/C++ - > OutputFiles:选择右边的Assembler Output vc6 下面是: Project Settings - > C/C++ - > Listing Files 选择Listing File Types 输出: vc8 在debug目录下的
析构函数声明为私有的作用 当我们规定类只能在堆上分配内存时,就可以将析构函数声明为私有的。class alloc{public: alloc():private: ~alloc();}; 如果在栈上分配空间,类在离开作用域时会调用析构函数释放空间,此时无法调用私有的析构函数。如果在堆上分配空间,只有在delete时才会调用析构函数。 可以添加一个destroy()函
operator new抛出异常的处理 operator new在无法完成内存分配请求时会抛出异常(以前的做法一般是返回0,一些旧一点的编译器还这么做,我们也可以恢复到旧的编译器方式例如:char * lp = new char[10000000]; 如果分配失败,在旧的编译器下会返回0,但是在新的编译器下会抛出异常std::bad_alloc我们也可以用在新的编译器下不抛出异常而返回0char * lp = new
读《大话设计模式》---生成器模式(Builder) 生成器模式:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 结构图 Builder是为创建一个Product对象的各个部件指定的抽象接口。ConcreteBuilder是具体生成者,实现Builder接口,构造和装配各个部件。Product是产品角色,Director是指挥者,它是构建一个使用Builder接口的对象。主要用于创建一些复杂的对象,这些
构造函数初始化表的使用规则 (1)如果类存在继承关系,派生类必须在其初始化表里调用基类的构造函数。class A{public: A(int x);};class B : public A{public: B(int x, int y);};//如果A没有默认构造函数,必须在初始化表里调用A的构造函数.B::B(int x, int y) :A(x) {}(2)类的const常
读《大话设计模式》---外观模式(Facade) 外观模式:为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得一个子系统更加容易使用 外观模式结构图 外观模式的一般实现方法:#include using namespace std;class SubSystemOne{public: void MethodOne() { cou
读《大话设计模式》---迪米特法则 迪米特法则也叫最少知识原则如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。如果其中一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。迪米特法则首先强调的前题是在类的结构设计上,每一个类都应当尽量降低成员的访问权限,也就是说,一个类包装好自己的private状态,不需要让别的类知道的字段或行为就不要公开。
菜鸟自学Linux之---RedHat Linux 9键盘的快捷操作 这里列举了一些你可以用来快速执行常见任务的键盘快捷操作。这些操作不仅限于所列出的内容,要了解更多命令行和键盘的的快捷操作,请访问: http://sunsite.dk/linux-newbie/lnag_commands.html#shortcuts [Ctrl] + [Alt] + [Backspace] = 杀死你当前的 X 会话。杀死图形化桌面会话,把你返回到登录屏幕。如果正常退
为什么会两次调用析构函数 在类生成临时对象时,遇到一个问题,程序会两次调用析构函数#include #include using namespace std;class stack{public: stack(const char *value); ~stack(); char * data;};stack::stack(const char
为含指针变量的类声明一个拷贝构造函数和一个赋值操作符 C++编译器会为每个类自动生成一个默认的构造函数、析构函数、赋值函数、拷贝构造函数,这当然是在你没有为你的类声明这些函数的时候。这些默认的功能函数在为你提供方便的时候,也会给你带来麻烦。例如:class string {public: string(const char *value); ~string(); ... // 没
菜鸟自学Linux之---ADSL 设置全攻略 一、安装rp-pppoe到 http://www.roaringpenguin.com/pppoe/#download下载最新版rp-pppoe 的源代码。tar xzvf rp-pppoe-3.5.tar.gz然后进入解压生成的目录:cd rp-pppoe-3.5cd src接下来就是常规的配置编译和安装,一切按默认的即可:./configuremakemake install至此,安装结束,下
菜鸟自学Linux之---掌握gcc和vi基本用法 编写程序可以用vi编辑器vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,这里只是简单地介绍一下它的用法和一小部分指令。由于对Unix及Linux系统的任何版本,vi编辑器是完全相同的,因此您可以在其他任何介绍vi的地方进一步了解它。Vi也是Linux中最基本的文本编辑器,学会它后,您将在Linux的世界里畅行无阻。 1、vi的基本概念 基本上v
读《大话设计模式》---模板方法模式(TemplateMethond) 模板方法模式: 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 模板方法的一般实现://AbstractClass是一个抽象类,其实也就是一个抽象模板,并且实现了一个模板方法。//这个模板方法一般是一个具体方法,它给出了一个顶级逻辑的骨架,而逻辑的组成步//骤在相应的抽象操作中,推
C++重载操作符 一、More Effective C++:不要重载的操作符与C一样,C++使用布尔表达式简化求值法(short-circuit evaluation)。这表示一旦确定了布尔表达式的真假值,即使还有部分表达式没有被测试,布尔表达式也停止运算。例如: char *p;...if ((p != 0) && (strlen(p) > 10)) ...这里不用担心当p为空时str
菜鸟自学Linux之---基本常识 Linux下如何用ADSL上网确定宽带线接入正确,确定ADSL开着灯也正常亮,确定网卡正常,确定网卡和ADS连接正常. 然后启动系统,确认系统上是否安装rp-pppoe这个软件(通过rpm -qa|grep pppoe来查找),如没有安装的用户,在光盘里或是到网上去down一个来,安装上后,以root用户执行adsl-setup,这样就进入了adsl的资料的设定状态,要求输入申请宽带的用户名
高质量C++/C编程指南---常量 常量是一种标识符,它的值在运行期间恒定不变。C语言用 #define来定义常量(称为宏常量)。C++ 语言除了 #define外还可以用const来定义常量(称为const常量)。 1 为什么需要常量 如果不使用常量,直接在程序中填写数字或字符串,将会有什么麻烦?(1)程序的可读性(可理解性)变差。程序员自己会忘记那些数字或字符串是什么意思,用户则更加不知它们从何处来、表示
菜鸟自学Linux之---必学的60个命令 Linux必学命令 Linux提供了大量的命令,利用它可以有效地完成大量的工作,如磁盘操作、文件存取、目录操作、进程管理、文件权限设定等。所以,在Linux系统上工作离不开使用系统提供的命令。要想真正理解Linux系统,就必须从Linux命令学起,通过基础的命令学习可以进一步理解Linux系统。 不同Linux发行版的命令数量不一样,但Linux发行版本最少的命令也有200多个。这里笔者把比较重要
菜鸟自学Linux之---硬盘安装篇 我装的是red hat 91、准备好一个空区,最小要有3G,因为除了安装系统的空间外,还要一个swap区,也就是交换区。一般为内存空间的两倍左右。要是安全安装的话,最少要5G的空间。分区的格式要为FAT32,不然的话不能识别。需要注意的是:FAT32最大可以支持的磁盘大小达到2TB(2047GB),但是不能支持小于512MB的分区,基于FAT32的Win 2000/XP可以支持分区最大为32G
读《大话设计模式》---原型模式(Prototype) 原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型来创建新的对象。原型模式其实就是从一个对象再创建另外一个可定制的对象,而且不需知道任何创建的细节。 我认为原型模式在C++中其实就相当于拷贝构造函数,clone执行的是浅拷贝,copy执行的是深拷贝。原型模式的基本代码: #include #include using namespace s
读《C++ Primer》(第一章) 解决大问题的一种方法是把它分解成许多小问题理想情况下这些小问题可以很容易地被解决然后再把它们合在一起就可以解决大问题了如果新分割的小问题解决起来还是太大就把它分割得再小一些重复整个过程直到能够解决每个小问题这个策略就是分而治之divide and conquer 和逐步求精stepwise refinement 书店问题可以分解成四个子问题或任务:1 读销售文件2 根据书名和出版社计算销
二级指针和二维数组的转换 void fun(char ** p) { char (*p1)[10] = (char(*)[10])p; cout } int main(int argc, char* argv[]){ char data[][10] = {"abc","123"}; fun((char **)data);
二维数组的动态分配和删除 二维数组的动态分配和删除 首先,动态支持数组的分配,必须用 new 来进行创建一段堆内存,其它的存贮区域不允许动态分配的产生。 其次,C++并没有提供真正的动态多维数组语法,想动态分配数组,必须通过一维动态数组组合形成一个类似多维数组的存贮形式,并不像静态分配多维数组,它们的用法虽说有些地方 有相似之处,但不完全相同。 再次,有些网友有一些很BT的分配方式。
wstring的一个小例子 #include #include #include using namespace std; vector Split(wstring &s) { wstring::size_type pos=0, pre_pos=0; wstring tempword; vector TermVec; while((po
c++陷阱之临时变量 1.向上强制类型转化产生临时变量 #include class Base{public: int m_b; Base(){m_b = 1;} void Say(){ m_b=7; };};class Drived:public Base{ int m_d;}; int m
在VC6.0中使用GDI+ 在VC6.0中使用GDI+ GDI+在原来GDI的基础上进行了许多的升级和优化,比如线条平滑、颜色透明度、图形变换(平移、缩放、旋转),更多图片格式支持等技术都进行了很大的改善,使用GDI+可以很方便的实现对各种图形的绘制和优化。GDI+属于.NET组合,不过VC6.0的朋友也可以很方面地使用它,在VC6.0和工程中使用GDI+的流程如下: 1.安装GDI+组件。对于
读《大话设计模式》---工厂方法模式(factory method) 工厂方法模式(factory method) :定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到他的子类。 简单工厂模式和工厂方法模式的区别:1.简单工厂模式简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。2.工厂方法模式工厂方法模式实现时,客户需
内联函数(inline)机制与陷阱 内容提要:1.内联相对于宏的优点2.为什么“inline”只是程序员对编译器的建议(而非强制命令)3.内联失败的陷阱在C、C++中函数调用需要少量开销。有时候这少量开销积少成多,对程序性能造成影响。有时候函数本身很简单,函数调用的开销比执行函数内容本身的开销还大。C程序员一定知道可以采用宏(Macro)机制来改善上述情况。但是宏基本上是在预编译阶段做文本替换,因此它有以下缺陷:
解读makefile和source文件 需要三个文件:源文件(假设只有一个), MAKEFILE, SOURCE总共三个文件。源文件是你的驱动程序了。MAKEFILE如下: ## DO NOT EDIT THIS FILE!!! Edit ./sources. if you want to add a new source# file to this component. This file merely indirects to
有关TinyXML使用的简单总结 这次使用了TinyXML后,觉得这个东西真是不错,于是将使用方法坐下总结来和大家分享。 该解析库在开源网站(http://sourceforge.net )上有下载,在本Blog也提供下载(下载TinyXML) TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux中编译。这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们
详细解说STL hash_map 用过map吧?map提供一个很常用的功能,那就是提供key-value的存储和查找功能。例如,我要记录一个人名和相应的存储,而且随时增加,要快速查找和修改:岳不群-华山派掌门人,人称君子剑张三丰-武当掌门人,太极拳创始人东方不败-第一高手,葵花宝典... 这些信息如果保存下来并不复杂,但是找起来比较麻烦。例如我要找"张三丰"的信息,最傻的方法就是取得所有的记录,然后按照名字一个一个
读《大话设计模式》---代理模式(proxy) 代理模式(proxy)为其他对象提供一个代理以控制对这个对象的访问。结构图//Subject类,定义了RealSubjext和Proxy的公共接口,这样就在任何使用RealSubject的地方可以使用Proxy class Subject{public: virtual void Request() = 0;};//RealSubject类,定
读《大话设计模式》---装饰模式(decorator) 装饰模式动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更灵活。 一般的实现代码class Component{public: //纯虚类 virtual void Operation() = 0;};class ConcreteComponent : public Component{
不用友元,访问类的私有成员变量的方法 虽然没有现实意义,但对理解C++的对象模型是很有帮助的。 前几天,在论坛里看到一个帖子,内容是: (原帖见:http://community.csdn.net/Expert/topic/5014/5014384.xml?temp=.3018152) ======================================== class a {
各位acmer 学累的时候不妨来看看 1.题库与网站资源 题库-在线提交系统(Online Judge)简介 下面是几个比较大的在线提交系统(Online Judge)里面有大量历年的竞赛题目,注册一个ID,然后用自己熟悉的语言(一般有Pascal/C/C++/Java)写好源代码提交即可,会实时返回信息告诉你是否正确。采用黑箱测试,系统里有一套标准的输入输出数据(对外保密,而且通常数据很多很怪),你的程序的输出和标准输出
cout 杂记 1. c++里关于cerr,clog,cout三者的区别:cerr(无缓冲标准错误)-----没有缓冲,发送给它的内容立即被输出clog(缓冲标准错误)--------有缓冲,缓冲区满时输出cout-------------------------标准输出三个都是ostream类定义的输出流对象,cout是在终端显示器输出,cout流在内存中对应开辟了一个缓冲区,用来存放流中的数据,当向cout流
16进制字符串转为整型 方法一 std::stringstream stream; string result="10000C"; int n = 0; stream stream >>hex>> n;方法二使用boost中的lexical_cast类. string str = "10000C"; int nIndex = lexical_cast (str); 方法三
读《大话设计模式》---依赖倒转原则 依赖倒转原则A.高层模块不应依赖低层模块,两个都应该依赖抽象。B.抽象不应依赖细节,细节应该依赖抽象。说白了就是要针对接口编程,不要对是想编程。 里氏代换原则(LSP)子类型必须能够替换掉它们的父类型说白了就是一个软件实体如果使用的是一个父类的话,那么它一定使用于子类,且它察觉不出父类对象和子类对象的区别。也就是说在软件里面,把父类替换成他的子类,程序的行为没有变化,简
在VC中编译、运行程序的小知识点 1、Run-Time LibraryRun-Time Library是编译器提供的标准库,提供一些基本的库函数和系统调用。我们一般使用的Run-Time Library是C Run-Time Libraries。当然也有Standard C++ libraries。 C Run-Time Libraries实现ANSI C的标准库。VC安装目录的CRT目录有C Run-Time库的大部分源代码。
vs2005设置总结 1.vs2005建立的工程默认是支持UNICODE的,我不用这个,所以在菜单中选择 Project->Properties, 弹出Property Pages窗口。在左边栏中依次选择:Configuration Properties->General,然后把右边栏的Character Set 改为Use Multi-Byte Character Set. 2.解决error LNK2001
读《大话设计模式》---开放-封闭原则 开放-封闭原则是指软件实体(类,模块,函数等等)应该可以扩展,但是不可以修改,对于扩展是开放的(Open for extension),对于更改是封闭的(Closed for modification)无论模块是多么的"封闭",都会存在一些无法对之封闭的变化,既然不可能完全封闭,设计人员必须对于他设计的模块应该对那种变化封闭作出选择。他必须先猜测出最有可能发生的变化种类,然后构造抽象来隔离
10本经典 C++书籍 1.《C++Primer》 有“C++的百科全书”,C++程序员人手必备。对语法、语义的描述非常细致和严谨,适合有一定经验的C、C++程序员作为工具书和理论指导书使用,但由于其有一定深度,而没有进阶顺序的章节安排,所以不适合初学者做为教材使用,价格略高。 难度:★★☆ 质量:★★★★★ 广度:★★★★★ 深度:★★★★ 性价:★★★☆ 2. 《C++Primer Plus》
读《大话设计模式》---策略模式(Strategy) 策略模式(Strategy) :它定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。 结构图: //Strategy抽象类,定义所有支持的算法的公共接口。class Strategy{public: Strategy(){}; //算法方法 virtual void AlgorithmInterface(){};};
清空输入缓冲 与 fflush 1. 为什么 fflush(stdin) 是错的首先请看以下程序: #include stdio.h> int main( void ){ int i; for (;;) { fputs("Please input an integer: ", stdout); scanf(
读《大话设计模式》---简单工厂模式(SimpleFactory)(二) 因为对C#不是很熟,所以将C#的程序转成了C++的。 // 一个超市打折的实例#include "stdafx.h"#include "stdio.h"//抽象类class CashSuper{public: virtual double acceptCash(double money) = 0;};//正常收费子类class CashNormal : public CashS
将string转化为int、double Method 1:使用C的atoi()和atof()。先利用c_str()转成C string,再用atoi()与atof()。#include #include #include using namespace std; int main() { string s = "123"; double n = atof(s.c_str()); //int n = atoi(s.c_
ifstream中取得文件长度 ifstream in("readme.txt"); ... streampos pos = in.tellg(); // save current position in.seekg(0, ios::end); cout in.seekg(pos); // restore saved posi
new的六种重载形式 当写出p = new P();这样的代码的时候, 实际上有两步操作, 首先分配内存,然后在分配好的内存之上初始化类成员.第二步是有构造函数完成的, 第一步就是new函数的工作.全局的new有六种重载形式, void *operator new(std::size_t count) throw(std::bad_alloc); //一般的版本void *op
预先准备好内存不够的情况 operator new在无法完成内存分配请求时会抛出异常(以前的做法一般是返回0,一些旧一点的编译器还这么做。你愿意的话也可以把你的编译器设置成这样。关于这个话题我将推迟到本条款的结尾处讨论)。大家都知道,处理内存不够所产生的异常真可以算得上是个道德上的行为,但实际做起来又会象刀架在脖子上那样痛苦。所以,你有时会不去管它,也许一直没去管它。但你心里一定还是深深地隐藏着一种罪恶感:万一new真的产
程序调试常见错误 随着诸如代码重构和单元测试等方法引入实践,调试技能渐渐弱化了,甚至有人主张废除调试器。这是有道理的,原因在于调试的代价往往太大了,特别是调试系统集成之后的BUG,一个BUG花了几天甚至数周时间并非罕见。 而这些难以定位的BUG基本上可以归为两类:内存错误和并发问题。而又以内存错误最为普遍,即使是久经沙场的老手,也有时也难免落入陷阱。前事不忘,后世之师,了解这些常见的错误,在编程时就加以注意,
旧的代码在2005下使用需要注意以下几点 将以前的代码在vc2005下编译,经常会遇到类似如下的警告: warning C4996: strcat was declared deprecated. 通常这类警告都是由于调用了字符串相关函数引起的。虽然这警告无伤大雅,仅仅只是说使用的函数已过时(deprecated),但看着实在别扭,且看看ms为什么要设置成这样。 搜索了一下ms的网站,找到了结果。ms认为以前的c/c++库中有
WNDCLASSEX结构 typedef struct { UINT cbSize; UINT style; WNDPROC lpfnWndProc; int cbClsExtra; int cbWndExtra; HINSTANCE hInstance; HICON hIcon; HCURSOR hCursor; HBRUSH hbr
Boost中的智能指针 Boost介绍 根据Boost网站的介绍,Boost是“一个免费的,可移植的,同步评测的C++库,Boost堪称是新类库的典范,特别是其中那些能够与ISO C++标准库良好的协同工作的库。”但是Boost不仅仅是一个库的集合。它也是一个快速发展的开发者社区,这些开发者创建,使用以及参与讨论Boost库。Boost社群不仅仅是维护着这个库,而且还为它的使用者和设计者提供学习交流的场所。这个库堪称是一
公共语言运行时(CLR) .NET Framework的核心是其运行时的执行环境,称为公共语言运行时(CLR) (common language runtim) 或 .NET运行时。在CLR的控制下运行的代码常常称为托管代码。 但是,在CLR执行开发的源代码之前,需要编译它们(在C#中或其他语言中)。在.NET中,编译分为两个阶段: (1) 把源代码编译为Microsoft中间语言(IL)。
仿STL中的堆算法的一个实现 #include "HeapAlgorithm.h"#include #include using namespace std;// push_heap为向堆中添加一个新的元素, 调用这个算法的前提是[First, Last)之间的元素满足堆的条件// 新加入的元素为Lastvoid push_heap(int* pFirst, int* pLast);// pop_heap为从
stl容器总结 一 迭代器(iterator)迭代器是类似指针的对象,STL算法利用它们对存储在容器中的对象序列进行遍历。5种类别:1、输入迭代器 2、输出迭代器 3、前向迭代器 4、双向迭代器 5、随机访问迭代器 常用的迭代器: istream_iterator输入流迭代器 istreambuf_iterato
Bjarne:什么是函数对象? 顾名思义,就是在某种方式上表现得象一个函数的对象。典型地,它是指一个类的实例,这个类定义了应用操作符operator()。 函数对象是比函数更加通用的概念,因为函数对象可以定义跨越多次调用的可持久的部分(类似静态局部变量),同时又能够从对象的外面进行初始化和检查(和静态局部变量不同)。例如:class Sum { int val; public: Sum(int i) :
Template parameters (C++ only) 在C++中有三种模板参数:Type template parameters (C++ only) Non-type template parameters (C++ only) Template template parameters (C++ only)在模板参数的声明中即可以使用关键字class也可以使用关键字typename,但是在模板参数的声明中不能指定存储的类型(st
读大《话设计模式》---简单工厂模式(SimpleFactory)(一) [说明]简单工厂模式是类的创建模式,又叫做静态工厂方法(Static Factory Method)模式。 简单工厂模式是由一个工厂对象决定创建出那一种产品类的实例。工厂模式的几种形态工厂模式专门负责将大量有共同接口的类实例化。工厂模式可以动态决定将哪一个类实例化,不必事先知道每次要实例化哪一个类。工厂模式有以下几种形态:简单工厂(Simple Factory)模式,又称静态工厂方法模
UML类图详解 本文是我在读《大话设计模式》时的一篇读书笔记 这个矩形框代表一个类,这是一个类图,它包括三层:显示类的名称,如果是抽象类,则用斜体表示。类的特性,通常为字段和属性。类的操作,通常是方法和行为。注意前面的符号:"+"表示Public,"-"表示private,"#"表示protect。 这是一个接口图,与
详细解说STL string 前言: string 的角色 C++ 语言是个十分优秀的语言,但优秀并不表示完美。还是有许多人不愿意使用C或者C++,为什么?原因众多,其中之一就是C/C++的文本处理功能太麻烦,用起来很不方便。以前没有接触过其他语言时,每当别人这么说,我总是不屑一顾,认为他们根本就没有领会C++的精华,或者不太懂C++,现在我接触perl, php, 和Shell脚本以后,开始理解了以前为什么有人说C++文本处
C++中单件设计模式(Singleton pattern)的语法实现 当我们需要只有一个类的实例返回给调用程序时,就可以使用单件设计模式(Singletom pattern).这种类的声明如下:class TheOnlyInstance{public: static TheOnlyInstance * GetTheOnlyInstance();protected: TheOnlyInstance(){}priv
函数的递归和调用 一、基本内容: C/C++语言中的函数可以递归调用,即:可以直接(简单递归)或间接(间接递归)地自己调自己。 要点: 1、C/C++语言函数可以递归调用。 2、可以通过直接或间接两种方式调用。目前只讨论直接递归调用。 二、递归条件 采用递归方法来解决问题,必须符合以下三个条件: 1、可以把要解决的问题转化为一个新问题,而这个新的问题的解决方法仍与原来
大值的存储和表示 #include #include using namespace std; int main() { int data[51]; /* 存储50位数,为了方便记忆,不适用data[0] */ int index = 1; /* 表示数组中的位数 */ int n;
C/C++/Perl/汇编/Java效率比较 事发 我无聊的翻着散落案头的书籍,这些都是五花八门的关于编程和系统管理的著作。干了这么多年程序员,大大小小的软件和项目也做了无数。每每有新入行的朋友问我这个所谓的"老前辈":哪种语言最好之类的问题,我总会作出一副知识渊博的样子,复述着从更老的老前辈那里听来的或者某些名著上看来的"知识"。就好比我们从学习编程的第一天起,就被计算机老师告知,COBOL语言是擅长处理商务事务、FOTRAN语言是用
VC++下命名管道编程的原理及实现 概述管道(Pipe)实际是用于进程间通信的一段共享内存,创建管道的进程称为管道服务器,连接到一个管道的进程为管道客户机。命名管道(Named Pipes)是在管道服务器和一台或多台管道客户机之间进行单向或双向通信的一种命名的管道。一个命名管道的所有实例共享同一个管道名,但是每一个实例均拥有独立的缓存与句柄,并且为客户——服务通信提供有一个分离的管道。实例的使用保证了多个管道客户能够在同一时间使
C++友元 1,friend申明一个友元friend一般为一句申明式,它位于一个类的内部,它申明一个类或者一个函数为该类的友元。friend并不是定义一个成员函数,所以friend放在public,protected或者private前都可以,完全是一样的。做为一个友元,即表示在该类或者该函数内部可以访问这个类的私有成员,你和朋友之间是不是应该没有什么隐藏的呢。例子:class A{public:
标准C++中的Iterator(迭代器) 一、概述Iterator(迭代器)模式又称Cursor(游标)模式,用于提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示。或者这样说可能更容易理解:Iterator模式是运用于聚合对象的一种模式,通过运用该模式,使得我们可以在不知道对象内部表示的情况下,按照一定顺序(由iterator提供的方法)访问聚合对象中的各个元素。由于Iterator模式的以上特性:与聚合对象耦合
《Modern C++ Design》Policies 和Policy Classes policy所谓policy,其实就是一个类或者类模板的接口,它由内部类型定义(inner type definition),成员函数,成员变量组成。它类似于设计模式中的Strategy.这里先介绍一下Strategy:结构意图定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。适用性
用C++干干净净地清除进程 读者朋友们可能经常会碰到这样一个问题,想对某些进行操作时,发现这些文件正在被其它程序使用,处于打开状态,而且是被独占打开,这时是没法对文件进行操作的。因此,要想操作这些文件,必须将打开这些文件的进程清除掉。那么如何干净地清除进程呢?其实,在Windows2000操作系统版本中有一个工具程序叫tskill.exe,用它就可以清除掉某个程序的进程,在输入"tskill 程序名"后就可以清除其运行实例。
SHGetFileInfo函数详解 SHGetFileInfo函数WINSHELLAPI DWORD WINAPI SHGetFileInfo( LPCTSTR pszPath, DWORD dwFileAttributes, SHFILEINFO FAR *psfi, UINT cbFileInfo, UINT uFlags);pszPath 参数:指定的文件名。 当u
《c++沉思录》--一个面向对象程序范例 面向对象有三个要素:数据抽象,继承以及动态绑定 问题描述: 1、一个表达式树包括代表常量、一元运算符、二元运算符的结点。2、我们希望通过调用合适的函数来创建这棵树,然后打印这棵树的完整括号化形式。 面向对象的解决方案:我们可以用一个联合(UNION)来容纳具体的值,用一个List来表示子结点,以包含联合(UNION)和List的类来表示结点。这些类有一个共同
虚拟内存(Virtual Memory) 虚拟内存(Virtual Memory)是Windows管理所有可用内存的方式。对于32位Windows系统,每个进程所用到的虚拟内存地址从0到2^32-1,总容量4GB,其中2GB是与操作系统以及其他所有进程所共享,另外2GB分派给进程独占(这就是常说的32位Windows中一个进程最多能用2G内存的由来)。4GB虚拟地址空间(Virtual Address Space,VAS)中,2GB的进程
关于如何换肤、子类化的解决方案 是我尝试过一些方法,以在CAboutDlg中子类化其中的Button为例: 第一种:直接用现成的类 1、自己写一个类class CButtonXP : public CButton{/*...*/} 用MessageMap处理感兴趣的消息。 2、用CButtonXP代替CButton来声明变量m_btn; 3、在void CAboutDlg:DoDataExchange(CDataExchange
多态和动态绑定(polymorphism and dynamic binding) FAQ 5.11 多态和动态绑定(polymorphism and dynamic binding)C++的这种特点使新的代码多少可以替代一些旧的代码:面向对象程序强大的真正原因不在于继承;而在于它可以将继承类对象当作基类对象来对待,支持这个特性的机制是多态和动态绑定(polymorphism and dynamic binding),多态允许将一个继承类的对象传递
堆和栈的区别 一、预备知识—程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。 3、全局区(静态区)(static)—,
Sleep和WaitForSingleObject ,WaitForMultipleObjects VOID Sleep(DWORD dwMilliseconds);该函数可使线程暂停自己的运行,直到dwMilliseconds过去为止。关于Sleep函数,有下面几个重要问题值得注意:* 调用Sleep,可使线程自愿放弃它剩余的时间片。* 系统将在大约的指定毫秒数内使线程不可调度。* 你可以调用Sleep,并且为dwMilliseconds参数传递INFINITE。这将告诉系统永远不要调度该线程
《Modern C++ Design》摘要 1. 你無法特化結構。單單使用templates,你無法特化「class 的結構」(我的意思是其資料成員),你只能特化其成員函式。2. 成員函式的特化並不能「依理擴張」。你可以對「單㆒template 參數」的class template 特化其成員函式,卻無法對著「多個template 參數」的class template 特化其個別成員函式。例如 :template class Widget
重载New操作符 一、重载规则I.可以重载的操作符+- */ %^& |~ !=>*=/= %=^=&=|=>>>===!=>= ||++-- ->*,->[]() operator new operator new[]operator delete operator delete []II.不能重载的操作符::..*? :sizeoftypeidnewdeletestatic_castdynami
使用::std::vector作为管理动态数组的优先选择 摘要: 本文介绍了C++标准库中的容器类vector,分析了它的优点,并且建议在应用程序中使用它作为动态数组的优先选择,而不是MFC的CArray在一些使用 MFC 的程序中,经常看到许多程序使用 CArray的设计问题,造成使用它的代码的复杂化,增加了维护难度。因此建议使用 ::std::vector。另外,也看到一些程序在用 malloc/realloc/free/new[]/dele
Visual C 线程同步技术剖析 使线程同步 在程序中使用多线程时,一般很少有多个线程能在其生命期内进行完全独立的操作。更多的情况是一些线程进行某些处理操作,而其他的线程必须对其处理结果进行了解。正常情况下对这种处理结果的了解应当在其处理任务完成后进行。 如果不采取适当的措施,其他线程往往会在线程处理任务结束前就去访问处理结果,这就很有可能得到有关处理结果的错误了解。例如,多个线程同时访问同一个 全局变量,如果都是读取操作,
VC下轻松实现扩展shell(一) 本节源码 VC 2005的用户需要注意的事项:The Express edition of VC 2005只能支持ATL和MFC其中之一,而文章中的代码需要同时用到ATL和MFC,所以在Express edition of VC 2005下这些代码是不可用的.VC 6的用户需要注意的事项:如果你用的是VC6,你必须更新过Platform SDK,你可以使用 web install ve
sizeof用法总结 在VC中,sizeof有着许多的用法,而且很容易引起一些错误。下面根据sizeof后面的参数对sizeof的用法做个总结。 A. 参数为数据类型或者为一般变量。例如sizeof(int),sizeof(long)等等。这种情况要注意的是不同系统系统或者不同编译器得到的结果可能是不同的。例如int类型在16位系统中占2个字节,在32位系统中占4个字节。 B. 参数为数组或指针。下面举例说
struct 中字节对齐问题 VC中下面几个结构体大小分别是多少呢struct MyStruct { double m4; char m1; int m3; }; struct MyStruct { char m1; double m4; int m3; }; #pragma pack(push)//保存对齐状态 #pragm
STL的map用法 1. map中的元素其实就是一个pair.2. map的键一般不能是指针, 比如int*, char*之类的, 会出错. 常用的就用string了,int也行.3. map是个无序的容器, 而vector之类是有序的. 所谓有序无序是指放入的元素并不是按一定顺序放进去的, 而是乱序, 随机存放的(被映射后近似随机存放).所以遍历的时候有些效率差别.4. 判断有没有找到该键的内容可以这样: std:
自修改代码(Self Modifying Code)详解 自修改代码的简要历史自修改代码有很广泛的用途:1.在10到20年前使用SMC(自保护代码)保护应用程序是很难的,即使是用它来把编译的代码放到内存里.2.在90年代中期95/NT出现了,那时的程序员对在新的操作系统下如何保护应用程序感到迷惑.不知道该如何将保护措施移植到这个新的版本下.已经不可能再自由的访问内存,硬件,和一般的操作系统,所有以前学会的技巧不得不放弃,开始人们认为除了使用V
程序自修改(SMC) 理论:所谓SMC(Self Modifying Code)技术,就是一种将可执行文件中的代码或数据进行加密,防止别人使用逆向工程工具对程序进行静态分析的方法,只有程序运行时才对代码和数据进行解 密,从而正常运行程序和访问数据。本篇通过一个简单的实例来介绍这个技术。需要的运行环境vc6,程序编译为release版。由于本篇我们要在程序执行过程中,修改代码段中的一个函数内容,而默认情况下,我们编译生成
一个类继承的问题 FAQ 8.14 如果"苹果袋"以kind-of方式继承至"水果袋",那么"水果袋"中就允许放入任何种类以kind-of方式从水果继承来的具体水果么? 原文描述 :Is bag-of-apple a kind-of bag-of-fruit, assuming bag-of-fruit allows the insertion of any kind-of