

Программирование на языке 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().
Похожие статьи: Индекс класса
