

Программирование на языке 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, т. е. архив «отсоединяется» от файла, на основе которого он был создан.
Похожие статьи: Метод Read
