按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
while (nNewCount……)
{
for
ar 》》 newData;
loop
AddTail(newData); operator》》 被多载( overloading )化
}
}
_AFX_INLINE CArchive& AFXAPI operator》》 (CArchive& ar;
}
CObject*& pOb)
{ pOb = ar。ReadObject (NULL); return ar; }
调用 CArchive::ReadObject
下页
518
…………………………………………………………Page 581……………………………………………………………
第8章 Document…View 深入探討
CObject* CArchive::ReadObject(const CRuntimeClass*
pClassRefRequested)
{
。。。
// attempt to load next stream as CRuntimeClass
UINT nSchema;
DWORD obTag;
CRuntimeClass* pClassRef = ReadClass (pClassRefRequested;
&nSchema; &obTag);
// check to see if tag to already loaded object
A
C CObject* pOb;
if (pClassRef == NULL)
{ 。。。 }
else
{
// allocate a new object based on the class just acquired
IMPLEMENT_SERIAL(CStroke;。。。)
pOb = pClassRef…》CreateObject();
曾展开出一个函数如下,此即动态生
成的奥秘:
// Add to mapping array BEFORE de…serializing
CheckCount();
CObject* PASCAL CStroke::CreateObject()
m_pLoadArray…》InsertAt(m_nMapCount++; pOb);
CObject* PASCAL CStroke::CreateObject()
{
{
return new CStroke;
return new CStroke;
}
// Serialize the object with schema no。 set in the archive
}
UINT nSchemaSave = m_nObjectSchema;
m_nObjectSchema = nSchema;
pOb…》Serialize(*this);
m_nObjectSchema = nSchemaSave;
} 调用 CStroke::Serialize
return pOb; D
}
CRuntimeClass* CArchive::ReadClass(const CRuntimeClass* pClassRefRequested;
A UINT* pSchema; DWORD* pObTag)
{
FFFF
WORD wTag; 本例读入
*this 》》 wTag;
。。。
CRuntimeClass* pClassRef;
UINT nSchema;
if (wTag == wNewClassTag)
{
// new object follows a new class id
if (( (*this; &nSchema)) == NULL)
pClassRef = CRuntimeClass::Load
。。。
}
else
{ B
DWORD nClassIndex;
//判断nCLassIndex 为旧类别,于是从类别型录网中取出
// 其CRuntimeClass,放在pClassRef
中。
C
。。。
}