荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: oopilix (PADRAD), 信区: Visual
标  题: [zz]MFC库详解
发信站: 荔园晨风BBS站 (Tue May 20 20:06:09 2003), 站内信件

1、[0-1]CObject成员 共9个成员

◆有关构造的

1、CObject( );

CObject缺省的构造函数CObject::Cobject,保护成员版本。

2、CObject(const CObject& objectSrc );

私有成员版本的构造函数。

参数

objectSrc 对其它CObject的引用。

备注:

这些函数是标准的CObject结构。缺省版本自动被你的继承类结构调用。如果你的类是可
串行化的(使用了IMPLEMENT_SERIAL宏),则你必须有一个缺省构造函数(无参数的那个构
造函数)在你的类声明。如果你不需要缺省的构造函数,则要声明一个“私有”或“保护
型的“空的”构造函数。要了解其他有关内容,请看CObject Class主题(在联机文档Visu
al C++ Programmer's Guide)。
标准的C++缺省类构造函数副本一个成员一个成员地复制构造函数(??此处不准确copy
constructor does a member-by-member
copy)。如果你的类需要构造函数但它却被重载的话,CObject的私有成员版的构造函数保
证能发出编译错误。如果你的类支持这些性能,你必须因此而提供一个构造函数副本。

3、operator new

创建。Cobject:: operator new专指new操作符。

void* operator new(size_t nSize)与throw(CMemoryException )函数配合使用,负责内
存的分配与释放。

void* operator new(size_t nSize,LPCSTR lpszFileName, int nLine)

与throw(CMemoryException )配合使用。

备注:

在发行版中,new操作以类似于malloc的方式执行最佳的内存分配。在调试版中,new操作
以带监视的分配方案参与检查内存监视信息。如果你使用了代码行:#define new
DEBUG_NEW在你自己的所有源代码之前,则第二个版本的new将被使用,文件名和行号被
保存在用于以后做报告的已分配内存块中。你不必操心提供额外的参数,宏会替你完成
这些工作。

尽管你不使用DEBUG_NEW在Debug模式,你仍然会得到监视信息,只不过没有文件名和行号
描述。

如果你重载该操作,则必须同时重载delete。不要使用标准库函数_new_handler。

4、operator delete

删除、释放操作。void operator delete( void* p );

备注:

在发行版中,operator delete简单地释放由operator new分配的内存。在调试版中,
operator delete操作以带监视的分配方案参与检查内存监视信息。如果你重载了
operators
new和delete,你将丧失调试能力。

5、operator =

赋值操作。void operator =( const CObject& src );

备注:

标准的C++缺省类的赋值行为是成员到成员的复制。如果你没有分配重载操作,私有成员
版的赋值操作保证发出编译错误。如果你打算分配你的派生类的对象,就必须在你的派
生类中提供一个赋值操作。

◆有关诊断的

6、AssertValid

验证对象的完整性。virtual void AssertValid( ) const;

备注:

AssertValid通过检查对象固有的状态来执行有效性验证。在调试版,AssertValid会断
定并如此终止带着列有判断失败行号和文件名信息的程序。

当你写自己的类时,你应该重载AssertValid函数来提供诊断功能。在检查派生类特有
的数据成员之前,重载的AssertValid 通常调用其基类的AssertValid 函数。

因为AssertValid是一个常量函数,在测试期间你无法改变对象的状态。你的派生类的
AssertValid函数不能排除例外,但能判断是否它们检测到被重载的对象数据。

“正确性”的定义依赖于该对象的类。作为规则,函数应该执行“简单检查” a "??
shallow check."即:如果对象包含指向其它对象的指针,它应该检查该指针是否非空的
,但它对由该指针所指的对象不执行有效性测试。

6、Dump

产生对象的诊断垃圾场。

virtual void Dump(CDumpContext& dc) const;

参数

dc 诊断??dump context for dumping, usually afxDump.

备注

Dumps the contents of your object to a CDumpContext object.

当你写自己的类时,你应该重载Dump函数来提供诊断功能。在打印派生类特有的数据成员
前,重载的Dump通常调用其基类的Dump函数。如果你的类用了IMPLEMENT_DYNAMIC或IMPLE
MENT_SERIAL宏,则CObject::Dump打印类名。

你的Dump函数不能在输出的尾部打印一新行字符。

Dump调用make sense???此段不明(侦测感应感觉感官意识观念情理知觉理智感觉觉察
了解)仅仅在MFC调试版中。You should bracket calls, function declarations, and
 function implementations with #ifdef _DEBUG/#endif statements for conditional
compilation.

Since Dump is a const function, you are not permitted to change the object sta
te during the dump.

The CDumpContext insertion (<<) operator calls Dump when a CObject pointer is
inserted.

Dump permits only "acyclic" dumping of objects. You can dump a list of objects
, for example, but if one of the objects is the list itself, you will
eventually overflow溢出 the stack堆栈.

◆有关串行化的

6、IsSerializable

测试对象是否能被串行化。BOOL IsSerializable( ) const;

返回值: 非零如果该对象能被串行化,否则为0。

备注:

测试对象是否能被串行化。应该类要可串行化,它的声明必须包含DECLARE_SERIAL宏,
并且实现部分必须包含IMPLEMENT_SERIAL宏。

不要重载该函数。

7、Serialize

加载或保存一个对象从/到一个文档。

virtual void Serialize( CArchive& ar );

throw( CMemoryException );

throw( CArchiveException );

throw( CFileException );

参数:

ar 一个Carchive对象,串行化的结果或来源。

备注:

你必须重载Serialize为每一个你打算串行化的类。重载Serialize必须首先调用其基类的
Serialize函数。你也必须使用DECLARE_SERIAL宏在你的类声明中,并且必须使用IMPLEME
NT_SERIAL宏在类实现中。用CArchive::IsLoading或CArchive::IsStoring来测定文档是
否加载或保存。Serialize通过CArchive::ReadObject和CArchive::WriteObject被调用。
这些函数是与Carchive类的插入操作(<<)和提取操作(>>)联合在一起的。

◆可重载的

8、GetRuntimeClass

返回CruntimeClass结构符合该对象的类。

virtual CRuntimeClass* GetRuntimeClass( ) const;

返回值: 一个指向与该对象的类一致的CruntimeClass结构的指针;永不为NULL。

备注:

这是一个CruntimeClass结构为每个CObject-派生类。结构成员如下:

LPCSTR m_lpszClassName 包含ASCII 类名的以null结尾的字符串。

int m_nObjectSize 用字节表示的对象大小。如果对象有指向已分配内存的数据成员,
该内存的大小未包括在内。

UINT m_wSchema 概要号码 ( – 1表示不可串行化的类)。看 IMPLEMENT_SERIAL宏 对概
要号码的描述。

CObject* ( PASCAL* m_pfnCreateObject )( ) 一个函数指针,指向缺省的构造函数,
它建立你的类的对象(仅当该类支持动态建立时有效,否则返回NULL).

CRuntimeClass* ( PASCAL* m_pfn_GetBaseClass )( ) 如果你的程序动态链接了MFC

的AFXDLL,一个函数指针返回基类的CruntimeClass结构。

CRuntimeClass* m_pBaseClass 如果你的程序静态链接了MFC,一个指针返回基类 的
CruntimeClass结构。

专业版和企业版的特有功能 静态链接MFC只在专业版和企业版中支持。

该函数需要在类实现中使用IMPLEMENT_DYNAMIC或IMPLEMENT_SERIAL宏,否则你将得不到
正确的结果。

9、IsKindOf

测试对象与所给类的关系。

BOOL IsKindOf(const CRuntimeClass* pClass ) const;

返回值: 如果对象与类一致为非零值,否则为0。

参数:

pClass 指向与你的CObject 派生类联合的CruntimeClass结 构的指针。

备注:

测试pClass看它(1)是否是指定类的对象或(2)是否是指定类的派生类的对象。该函数仅
当类声明中使用了DECLARE_DYNAMIC或DECLARE_SERIAL宏时才有效。

不要广泛使用该函数,因为它使C++的多态性失效。可以用虚函数来代替它。



--
※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 61.144.235.39]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店