按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
private:
。 。。
};
虽然Visual C++ 编译器自从4。0 版已经支持RTTI ,但MFC 4。x 并未使用编译器的能力
完成其对RTTI 的支持。MFC 有自己一套沿用已久的办法(从1。0 版就开始了)。喔,
不要因为MFC 的作法特殊而非难它,想想看它的悠久历史。
MFC 的RTTI 能力牵扯到一组非常神秘的宏( DE CLARE_D YNAMIC 、
IMPLEMENT D YNAMIC CRuntimeClass
_ MFC
)和一个非常神秘的类别( )。 程序员都知
道怎么用它,却没几个人懂得其运作原理。大道不过三两行,说穿不值一文钱,下一章
我就仿真出一个RTTI 的DOS 版本给你看。
Dynamic Creation)
动态生成 (
对象导向术语中有一个名为persistence,意思是永续存留。放在RAM 中的东西,生命
受到电力的左右,不可能永续存留;唯一的办法是把它写到文件去。MFC 的一个术语
Serialize,就是做有关文件读写的永续存留动作,并且实做作出一个虚拟函数,就叫作
Serialize 。
看起来永续存留与本节的主题「动态生成」似乎没有什么干连。有!你把你的资料储存
到文件,这些资料很可能(通常是)对象中的成员变量 我把它读出来后,势必要依据
文件上的记载,重新new 出那些个对象来。问题在于,即使我的程序有那些类别定义(就
算我的程序和你的程序有一样的内容好了),我能够这么做吗:
char className'30' = getClassName(); // 从文件(或使用者输入)获得一个类别名称
CObject* obj = new classname; // 这一行行不通
95
…………………………………………………………Page 158……………………………………………………………
首先,new classname 这个动作就过不了关。其次,就算过得了关,new 出来的对象究
竟该是什么类别类型?虽然以一个指向MFC 类别老祖宗(CObject )的对象指针来容纳
它绝对没有问题,但终不好总是如此吧!不见得这样子就能够满足你的程序需求啊。
显然,你能够以Serialize 函数写档,我能够以Serialize 函数读档,但我就是没办法恢复
…
你原来的状态 除非我的程序能够「动态生成」。
DE CLARE D YNCREA TE
MFC 支持动态生成, 靠的是一组非常神秘的宏( _ 、
IMPLEMENT D YNCREA TE CRuntimeClass
_
)和一个非常神秘的类别( )。第3章中我将
把它抽丝剥茧,以一个DOS 程序仿真出来。
Exception Handling)
异常处理 (
Exception C++
(异常情况)是一个颇为新鲜的 语言特征,可以帮助你管理执行时期的错
nested Wat C++
误,特别是那些发生在深度巢状( )函数调用之中的错误。 是最早支
持ANSI C++ 异常情况的编译器,Borland C++ 4。0 随后跟进,然后是Microsoft Visual
C++ 和Symantec C++ 。现在,这已成为C++ 编译器必需支持的项目。
C++ exception C setj mp longjmp
的 基本上是与 的 和 函数对等的东西,但它增加了一
些功能,以处理C++ 程序的特别需求。从深度巢状的例程调用中直接以一条快捷方式撤回
到异常情况处理例程(exception handler ),这种「错误管理方式」远比结构化程序中经
过层层的例程传回一系列的错误状态来的好。事实上exception handling 是MFC 和
OWL 两个application frameworks 的防弹中心。
C++ 导入了三个新的exception 保留字:
1。 try 。之后跟随一段以{ } 圈出来的程序代码,exception 可能在其中发生。
2。 catch 。之后跟随一段以{ } 圈出来的程序代码,那是exception 处理例程之所在。
catch 应该紧跟在try 之后。
3。 throw 。这是一个指令,用来产生(抛出)一个exception 。
96
…………………………………………………………Page 159……………………………………………………………
第2章 C++ 的重要性伲�
下面是个实例 :
try {
// try block。
}
catch (char *p) {
printf(〃Caught a char* exception; value %sn〃;p);
}
catch (double d) {
printf(〃Caught a numeric exception; value %gn〃;d);
}
catch (。。。) { // catch anything
printf(〃Caught an unknown exceptionn〃);
}
MFC 早就支持exception,不过早期它用的是非标准语法。Visual C++ 4。0 编译器本身支
持完整的C++ exceptions,MFC 也因此有了两个exception 版本:你可以使用语言本身
提供的性能,也可以沿用MFC 古老的方法(以宏形式出现)。人们曾经因为MFC 的
方案不同于ANSI 标准而非难它,但是不要忘记它已经运作了多少年。
MFC 的exceptions 机制是以宏和exception types 为基础。这些宏类似C++ 的
exception 保留字,动作也满像。MFC 以下列宏仿真C++ exception handling:
TRY
CATCH(type;object)
AND_CATCH(type;object)
END_CATCH
CATCH_ALL(object)
AND_CATCH_ALL(object)
END_CATCH_ALL
END_TRY
THROW()
THROW_LAST()
MFC 所使用的语法与日渐浮现的标准稍微不同,不过其间差异微不足道。为了以MFC
捕捉exceptions,你应该建立一个TRY 区块,下面接着CATCH 区块:
TRY {
// try block。
}
CATCH (CMemoryException; e) {
97
…………………………………………………………Page 160……………………………………………………………
第篇 勿在浮砂築高台
printf(〃Caught a memory exception。n〃);
}
AND_CATCH_ALL (e) {
printf(〃Caught an exception。n〃);
}
END_CATCH_ALL
THROW 宏相当于C++ 语言中的thro