小何与小乌的故事

VC

深入浅出MFC-MFC六大关键技术笔记

星期日, 01月 20th, 2008

上图为MFC各主要类的关系图
1.RTTI(执行时期类型识别)
以shape 为例,希望达到的技术效果如下,再程序执行期间可以识别对象的类型:
CSquare* pSquare = new CSquare;
cout << pSquare->IsKindOf(CSquare); // 应该获得1(TRUE)
cout << pSquare->IsKindOf(CRect); // 应该获得1(TRUE)
cout << pSquare->IsKindOf(CShape); // 应该获得1(TRUE)
以MFC 的类别阶层来说,希望:
CMyDoc* pMyDoc = new CMyDoc;
cout << pMyDoc->IsKindOf(CMyDoc); // 应该获得1(TRUE)
cout << pMyDoc->IsKindOf(CDocument); // 应该获得1(TRUE)
cout << pMyDoc->IsKindOf(CCmdTarget); // 应该获得1(TRUE)
cout << pMyDoc->IsKindOf(CWnd); // 应该获得0(FALSE)
要达到RTTI 的能力,我们(类别库的设计者)一定要在类别构造起来的时候,记录必要的信息,以建立型录。型录中的类别信息,最好以串行(linked list)方式串接起来,将来方便一一比对。我们这份「类别型录」的串行元素将以CRuntimeClass 描述之,那是一个结构。结构如下:
struct CRuntimeClass
{
// Attributes
LPCSTR m_lpszClassName;
int m_nObjectSize;
UINT m_wSchema; // schema number of the loaded class
CObject* (PASCAL* [...]

看完了深入浅出C++第三章(MFC六大关键技术之模拟),thinking in java第六章的3/4!

星期六, 01月 19th, 2008

最近比较累,也晚了,要写的也比较多,就改天补上吧!

深入浅出MFC第二章

星期日, 01月 13th, 2008

1.静态成员
静态成员变量属于类,而不属于对象。故程序可以在没有诞生任何对象前处理这种变量。但首先必须初始化它。static成员变量的初始化操作应不应放在类的构造函数,类的头文件,因为它们都有可能被执行多次,从而发生改变,导致混乱!设定static成员变量初值时不受变量存取权限的束缚。static成员变量的类型也应放在初值设定语句中。因为这是一个初值设定操作,而不是一个赋值(assignment)操作。事实上,static成员变量是在这时候才定义的,而不是类声明中。如果没有初始化操作,会产生链接错误。
静态成员函数只处理类中的静态变量,无法处理类中的非静态成员变量,因为静态成员函数没有this指针。而成员函数之所以能单一份处理多个对象的 数据而不会发生混乱,主要是靠每个对象的this指针!
2.虚函数
(1).如果要派生类重新定义一个成员函数,应在基类中把此函数设为virtual
(2).以单一指令调用不同函数,这一性质叫作多态性(polymorphism)) ,the ability to assume many forms;虚函数是c++实现多态性的以及动态绑定的关键(与java不同,C++默认是早绑定);
(3).抽象类中的虚函数不打算使用它,那么应 把它设为纯虚函数,在函数声明后加=0;
(4).拥有纯虚函数的类称为抽象类,抽象类不能产生抽象对象,但可以操作抽象类的指针,以方便于操作其派生类;
(5).虚函数派生下去还是虚函数。因此可以不加关键字virtual。
3.c++中的多态性(polymorphism)
为了达到动态绑定的目的,C++为每一个定义了虚函数的类都生成了一个虚函数表。表中的每一个元素指向了类中虚函数的地址。同时为该类加上一个成员变量vptr,指向该虚函数表的指针。其示意图如下:

4.对象切割(object slicing)
在C++中,如果采用这用形式,会发生对象切割现象:
cdocument(mydocument).func(其中mydocument 为cdocument派生类的对象) ,因为这是传值操作而不是传址操作,而,一般派生类都比基类要大,这时mydocument被切割成Cdocument类的对象,实际上是编译器拷贝了一份Cdocument的对象,示意图如下:

5.构造函数与析构函数
待续

08.1.11 开始拜读–深入浅出mfc

星期五, 01月 11th, 2008

刚看了侯俊杰编的深入浅出mfc第二版第一章,里面介绍了win32的基本程序概念,讲述了win32程序的开发流程,动态链接库,以消息为基础,以事件为驱动的运行机制!此外里面还牵扯到了很多例如console,thread,makefile,编译,链接方面,看了有点烦,不像看java那么爽,第一章一开始就讲了很多的概念,虽然说可能会有提纲挈领的作用,但对初学者来说,被吓到了,不想看了,又一次想闭上眼睛睡觉了!结果匆匆而过,我想还是从最基本的概念看起吧,等看好后面的,再回过头来看第一章吧!