2010年5月31日
摘要: GDI+ 是GDI(Windows 早期版本提供的图形设备接口)的后续版本,是Microsoft Windows XP作系统即后续版本的图形显示技术。它已经集成到了.Net开发环境中,所以不管你的OS是什么版本,只要安装了.Net框架,就有了GDI+(注意:是.Net框架,而不是.Net开发环境,所以Win98中也可以使用GDI+)。 现在,言归正传。 在头文件中加入下面的代码:#include ... 阅读全文
posted @ 2010-05-31 23:50 carekee 阅读(673) 评论(0) 推荐(0)
摘要: 在数学中用gcd(a, b)来表示两个正整数a和b的最大公约数。而且存在下面这个最大公约数递归定理: gcd(a, b) = gcd(b, a mod b) (mod表示取余数) 欧几里得在《几何原本》中描述了利用上面的定理递归求两个正整数的最大公约数的算法。实现起来非常简单,下面是C++代码:unsigned int Euclid(unsigned int nA, unsigned int n... 阅读全文
posted @ 2010-05-31 23:46 carekee 阅读(496) 评论(0) 推荐(0)
摘要: Fibonacci(斐波那契)序列的递归算法大家都已经很熟悉了:// Fibonacci序列第n项的值// 递归算法unsigned int Fib1(unsigned int n){ if (n == 1 || n == 2) return 1; else return Fib(n - 1) + Fib(n - 2);} 而且递归算法的缺点是效率太低,下面是非递归算法:// Fibonacci序... 阅读全文
posted @ 2010-05-31 23:45 carekee 阅读(759) 评论(0) 推荐(0)
摘要: 在C++多继承体系当中,在派生类中可以重写不同基类中的虚函数。下面就是一个例子:class CBaseA{public: virtual void TestA();};class CBaseB{public: virtual void TestB();};class CDerived : public CBaseA, public CBaseB{public: virtual void TestA... 阅读全文
posted @ 2010-05-31 23:43 carekee 阅读(750) 评论(0) 推荐(1)
摘要: 一个map就是一个(关键码(key),值(value))对偶的序列,它提供基于关键码的快速提取操作。也就是说,可以用下标运算符[]将关键码作为下标去执行查找,并返回对应的值。因此可以把map的使用方法想象成有特殊下标的数组。在很多时候用下标运算符[]来对map中的元素进行存取是非常方便和简单的;但是,如果map下标运算符[]运用不得当,也会造成意想不到的问题。 我们知道,C++是不检查下标越界的。... 阅读全文
posted @ 2010-05-31 23:42 carekee 阅读(994) 评论(1) 推荐(0)
摘要: 有下面的一个简单的类:class CNullPointCall{public: static void Test1(); void Test2(); void Test3(int iTest); void Test4();private: static int m_iStatic; int m_iTest;};int CNullPointCall::m_iStatic = 0;void CNull... 阅读全文
posted @ 2010-05-31 23:41 carekee 阅读(218) 评论(0) 推荐(0)
摘要: 在我那篇《浅析C++中的this指针》中,我通过分析C++代码编译后生成的汇编代码来分析this指针的实现方法。这次我依然用分析C++代码编译后生成的汇编代码来说明C++中虚函数调用的实现方法,顺便也说明一下C++中的对象内部布局。下面所有的汇编代码都是用VC2005编译出来的。虽然,不同的编译器可能会编译出不同的结果,对象的内部布局也不尽相同;但是,只要是符合C++标准的编译器,编译结果和对象的... 阅读全文
posted @ 2010-05-31 23:41 carekee 阅读(260) 评论(0) 推荐(1)
摘要: 现在,有下面的代码:namespace lx1{ class Point3d { public: Point3d (double dx, double dy, double dz) : m_dX(dx), m_dY(dy), m_dZ(dz) {} double getX() const { return m_dX; }; double getY() const { return m_dY; };... 阅读全文
posted @ 2010-05-31 23:40 carekee 阅读(450) 评论(0) 推荐(0)
摘要: 写这篇文章的动机来源于网友purewinter在我的那篇《重读《设计模式》之学习笔记(三)--SINGLETON模式的疑惑》中的评论。 在那篇文章中,我提供了如下一个用C++实现的Singletion模式的小例子:class ClxSingletonMEC{public: friend ClxSingletonMEC& InstanceMEC();private: ClxSingleton... 阅读全文
posted @ 2010-05-31 23:39 carekee 阅读(408) 评论(0) 推荐(0)
摘要: 在开发中,经常会用到一些数组,它里面存放一定数量(已知,不是太多)的特定元素。在使用数字表示的数组下标访问数组中元素的时候,根本不知道该元素是否是需要的那个元素,而且使代码可读性降低,甚至还会出现下标越界的危险。 比如,现在有如下的继承体系:class CShape;class CSquare : public CShape;class CRectangle : public CShape;cla... 阅读全文
posted @ 2010-05-31 23:38 carekee 阅读(1346) 评论(0) 推荐(0)
摘要: 比如说有这样一个类的继承体系:类CDerivedA和CDerivedB都继承自类CBase。如果要写一个函数传入上面类中的一个对象的引用,在函数里面我们要根据对象的类型来进行相应的处理,也就是说对不同类型的对象进行不同的处理。在这种情况下我们就需要类的对象中保存有类型信息。下面就用一个简单的例子来说明怎么让自己编写的类有类型信息。 首先,根据类的继承关系创建类型信息tag:struct lx_Ba... 阅读全文
posted @ 2010-05-31 23:37 carekee 阅读(281) 评论(0) 推荐(0)
摘要: 引子 如果让你用C++写一个实用的字符串类,我想下面的方案是很多人最先想到的:class ClxString{public: ClxString(); ClxString(const char *pszStr); ClxString(const ClxString &str); ClxString& operator=(const ClxString &str); ~Clx... 阅读全文
posted @ 2010-05-31 23:36 carekee 阅读(423) 评论(0) 推荐(0)
摘要: 比如我们有下面的类:class ClxECS{public: int DoSomething() { // 这里以输出一句话来代替具体的操作 cout << "Output from method DoSomething!" << endl; return 0; };}; 和下面的一个vector:vector<ClxECS*> vECS;for (int i ... 阅读全文
posted @ 2010-05-31 23:35 carekee 阅读(401) 评论(0) 推荐(0)
摘要: 对于如下的类:class ClxECS{public: double Test(double dValue) { return dValue * 13; };private: int Test(int iValue) { return iValue * 13; };}; 下面的函数输出是什么?void ECS_test(){ int iValue = 13; ClxECS lx; cout <... 阅读全文
posted @ 2010-05-31 23:34 carekee 阅读(290) 评论(0) 推荐(0)
摘要: mutalbe的中文意思是“可变的,易变的”,跟constant(既C++中的const)是反义词。 在C++中,mutable也是为了突破const的限制而设置的。被mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中。 我们知道,如果类的成员函数不会改变对象的状态,那么这个成员函数一般会声明成const的。但是,有些时候,我们需要在const的函数... 阅读全文
posted @ 2010-05-31 23:34 carekee 阅读(172) 评论(0) 推荐(0)
摘要: 我们知道,类的私有成员在类的外部是不能被访问的。 例如有下面的这个简单的类:class ClxECS{private: int iPrivate;}; 那么下面的这个函数是不能通过编译的:void ECS_test(){ ClxECS lx; lx.iPrivate = 13; cout << lx.iPrivate << endl;} 但是,我们并不是没有办法来访问类的... 阅读全文
posted @ 2010-05-31 23:33 carekee 阅读(931) 评论(0) 推荐(0)
摘要: 怎么对容器中的所有对象都进行同一个操作?我们可能首先想到的是用循环来实现。 比如有如下的一个类:class ClxECS{public: int DoSomething() { // 这里以输出一句话来代替具体的操作 cout << "Output from method DoSomething!" << endl; return 0; };}; 现在定义如下一个vect... 阅读全文
posted @ 2010-05-31 23:32 carekee 阅读(249) 评论(0) 推荐(0)
摘要: 有如下一个简单的复数类:class ClxComplex{public: ClxComplex(double dReal = 0.0, double dImage = 0.0) { m_dReal = dReal; dImage = dImage; } double GetReal() const { return m_dReal; } double GetImage() const { retu... 阅读全文
posted @ 2010-05-31 23:30 carekee 阅读(290) 评论(0) 推荐(0)
摘要: 我在今年2月份写了篇《C++中接口与实现分离的技术》的文章,用一个很简单的例子说明了在C++中接口与实现分离的好处及实现方法。很荣幸,这篇文章被推荐到了CSDN的首页并被多家网站转载。 可是当时写那篇文章的时候,没有考虑到类与类之间的继承关系。下面我就来具体的谈谈这个方面。 还是以上面提到的那篇文章中的例子来说明。 执行类: lxImplement.h文件内容:#include "lxTest.h... 阅读全文
posted @ 2010-05-31 23:29 carekee 阅读(308) 评论(0) 推荐(0)
摘要: 在开发的时候会遇到这种情况,就是在执行某些功能的时候要对一些环境变量或配置信息进行修改,功能执行完毕之后再把这些变量或配置信息设置恢复回去。举个例子:有些游戏只能在分辨率为800*600的环境下运行,如果要在分辨率1024*768的电脑上玩,就要在运行游戏的时候把分辨率改为800*600,退出游戏的时候再把分辨率改回1024*768。 其实处理这样的情况也不是很难,我们可以写一个设置环境变量或配置... 阅读全文
posted @ 2010-05-31 23:29 carekee 阅读(383) 评论(0) 推荐(0)
摘要: 有下面一个简单的类:class ClxTest{public: ClxTest(int iSize = 13) { pszStr = new char[iSize]; }; ~ClxTest() { if(pszStr) delete []pszStr; }; lxOutput() { cout << pszStr << endl; };private: char *psz... 阅读全文
posted @ 2010-05-31 22:51 carekee 阅读(184) 评论(0) 推荐(0)
摘要: 在我的那篇“C++中虚析构函数的作用”中我说明了为什么作为基类的类的析构函数必须是虚函数,同时也指出:为了避免产生虚函数表,如果类不是基类的话,析构函数就不需要声明为虚函数。 但是,我们不能预料用户的行为,你不敢肯定用户是否会从你的类去派生自己的类。如果用户以一个基类指针去删除一个派生类的对象,就会发生派生类的析构函数不被调用的情况。这样做的危险性我想大家都知道。当然,你可... 阅读全文
posted @ 2010-05-31 21:50 carekee 阅读(812) 评论(0) 推荐(0)
摘要: 我们知道,用C++开发的时候,用来做基类的类的析构函数一般都是虚函数。可是,为什么要这样做呢?下面用一个小例子来说明: 有下面的两个类:class ClxBase{public: ClxBase() {}; virtual ~ClxBase() {}; virtual void DoSomething() { cout << "Do something in class ClxBase... 阅读全文
posted @ 2010-05-31 21:45 carekee 阅读(223) 评论(0) 推荐(0)
摘要: 在用C++写要导出类的库时,我们经常只想暴露接口,而隐藏类的实现细节。也就是说我们提供的头文件里只提供要暴露的公共成员函数的声明,类的其他所有信息都不会在这个头文件里面显示出来。这个时候就要用到接口与实现分离的技术。 下面用一个最简单的例子来说明。 类ClxExp是我们要导出的类,其中有一个私有成员变量是ClxTest类的对象,各个文件内容如下: lxTest.h文件内容:class ClxTes... 阅读全文
posted @ 2010-05-31 21:45 carekee 阅读(806) 评论(1) 推荐(0)
摘要: 利用VC2005实现了邮件发送,源程序如下://-------------------------------------------------------SmtpSendEmail.h------------------------------------#pragma once#include <list> #include <string> #include <... 阅读全文
posted @ 2010-05-31 17:27 carekee 阅读(2204) 评论(0) 推荐(0)
摘要: 根据输入条件进行查询,并将查询到的结果高亮显示,属性信息显示出来private void btnSearch_Click(object sender, System.EventArgs e){ if (txtName.Text.Trim() == "") { MapInfo.Data.Table table = MapInfo.Engine.Session.Current.Catalog.GetT... 阅读全文
posted @ 2010-05-31 15:22 carekee 阅读(468) 评论(0) 推荐(0)
摘要: 关于使用动画图层的一个方法首先是要对图层进行初始化,初始出来新的一个图层中的两个图元。private void btnInitializeObjects_Click(object sender, System.EventArgs e){Catalog Cat = MapInfo.Engine.Session.Current.Catalog;//Create Temp layerTableInfoM... 阅读全文
posted @ 2010-05-31 15:20 carekee 阅读(467) 评论(0) 推荐(0)