Программирование на языке MFC

Мой второй блог в серии программирования

Правила при разборе тэгов


Исходя из сказанного выше, мы можем прийти к выводу о том, какими правилами можно пользоваться при разборе тэгов, запи­санных в архив:

1. Если значение считанного слова (назовем его wTag) меньше wBigObjectTag (wTag<wBigObjectTag), то, значит, мы считали тэг объекта, за которым должна следовать информация, записан­ная методом Serialize() этого объекта.

2. Если значение считанного слова wTag больше или равно (wTag >= (wClassTag + 1)), но меньше wNewClassTag (wTag< wNewClassTag), то мы считали ссылку на индекс класса. Индекс класса может быть получен путем сброса в нуль старшего разряда слова.

3. Если значение считанного слова wTag равно wNewClassTag (wTag == wNewClassTag), то, значит, мы считали признак того, что за объектом должно слеловать описание впервые встретив­шегося в архиве класса.

4. Если значение считанного слова wTag равно wBigObjectTag (wTag== wBigObjectTag), то, значит, за этим словом следует двой­ное слово (назовем его dwTag), в котором содержится индекс объекта или класса.

5. Если значение двойного слова dwTag больше dwBigClassTag (dwTag > dwBigClassTag), то, значит, мы считали индекс класса. Индекс класса может быть получен путем сброса в нуль стар­шего разряда двойного слова.

6. Если значение двойного слова dwTag меньше dwBigClassTag (dwTag < dwBigClassTag), то, значит, мы считали индекс объекта. На этом метод WriteObject() завершает свою работу. Если под­вести итог сказанному выше, то можно сделать вывод о том, что основной задачей метода WriteObjectQ является сброс в архив данных о классах сохраняемых объекта и выполнение метода Seri-alizeQ сохраняемого объекта. При этом для того, чтобы предотвра­тить дублирование данных, данные предварительно помещаются в хэш-таблицу. При необходимости повторно записать какие-то данные, в архив записываются не сами данные, а только своеобразная ссылка, которая представляет собой порядковый номер (индекс) данных в хэш-таблице.

Хотелось бы отметить, что программист может не вызывать в программе напрямую метод WriteObject(), а воспользоваться опе­ратором "«". Дело в том, что оператор для записи объекта в архив также перегружен и имеет вид:

_AFX_INLINE CArchive& AFXAPI operator«(CArchive& ar,

const CObject* pOb)

{

ar.WriteObject(pOb); return ar;

}

Другими словами, перегруженный оператор ««» представляет собой скрытый вызов метода WriteObject().

Похожие статьи: