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

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

Возвра­щенное значение FALSE


Этот метод не делает ничего особенного, просто перебирается цепочка базовых классов. Если указатель на информацию време­ни выполнения базового класса совпадет с информацией времени исполнения проверяемого класса, то, значит, проверяемый класс является наследником базового класса. В этом случае метод воз­вратит значение TRUE. В противном случае мы дойдем до значе­ния NULL, что будет означать, что проверяемый класс наследни­ком базового класса не является. Признаком этого будет возвра­щенное значение FALSE.

И, кажется, все, что можно проверить, уже проверено. Метод ReadClassQ записывает по переданным ему ссылкам значения подготовленных схемы и ссылки на класс, после чего возвраща­ет указатель на информацию времени выполнения объекта. Не забудьте, что помимо возвращаемых значений, результатом работы метода ReadClass() является и заполненный элемент в массиве.

Итак, мы опять вернулись в метод ReadObject(). Какие возмож­ные варианты дальнейших действий необходимо рассмотреть?

Вариант первый – метод ReadClass() вернул NULL. Это означает, что из архива был считан тэг объекта.

Вариант второй – метод ReadClass вернул ненулевое значение. Это означает, что из архива был считан тэг класса.

Итак, что происходит в том случае, если считан тэг класса? Во-первых, создается объект этого класса. Согласитесь, чита­тель, мы не можем записать в архив просто класс, мы записыва­ем в архив ОБЪЕКТЫ класса, следовательно, после каждого описания класса или ссылки на класс должен следовать тэг объ­екта, верно? Во-вторых, указатель на этот объект помещается в очередной элемент массива указателей. И, в-третьих, вызы­вается метод Serialize() объекта. Метод ReadObjectQ возвраща­ет указатель на считанный из архива объект. Мы дошли до логического завершения процесса сериализации. Нерассмотрен­ным осталась небольшая деталь.

Итак, что происходит в случае считывания тэга объекта? Если индекс объекта превышает число элементов в массиве, то, значит, произошла ошибка, на которую метод реагирует выработкой ис­ключения. После этого метод выбирает из массива ранее записан­ный указатель на объект и проверяет, принадлежит ли он к ожи­даемому классу. Если проверка проходит успешно, метод возвра­щает указатель на объект, который был считан ранее. В про­тивном случае вырабатывается исключение.

После того, как данные были записаны в архив или считаны из архива, архив желательно закрыть. Это делается при помощи об­ращения к методу Close(), исходный код которого находится в фай­ле агссоге.срр:

void CArchive::Close() {

ASSERT_VALID(m_pFile);

Flush(); m_pFile = NULL;

Как видно из исходного текста метода, содержимое буфера «сбра­сывается» в файл и поле m_pFile делается равным NULL, т. е. архив «отсоединяется» от файла, на основе которого он был создан.

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