Программирование на Visual C++. Архив рассылки [Алекс Jenter] (fb2) читать постранично, страница - 2
[Настройки текста] [Cбросить фильтры]
- 1
- 2
- 3
- 4
- . . .
- последняя (262) »
Ну вот, на сегодня пока все. Жду ваших писем с замечаниями, предложениями и пожеланиями. До скорого!
(C) 2000 by Алекс Jenter mailto:jenter@mail.ru.
Программирование на Visual C++ Выпуск №2 от 20/6/2000
Приветствую вас, уважаемые подписчики! Очень рад, что число вас растет, несмотря на то, что рассылка еще не вышла из категории "Рассылки для каждого" и не была официально анонсирована. Если новоподписавшимся интересно узнать, о чем мы в рассылке беседуем, они могут посмотреть в архиве первый выпуск. Сегодня мы немного поговорим об устройстве MFC, а также рассмотрим один интересный вопрос.НЕМНОГО ТЕОРИИ
Как известно, основой всех основ в MFC является класс CObject. Основным назначением этого класса является предоставление некоторых базовых возможностей всем своим наследникам, а именно доступ к информации о классе во время выполнения и поддержка сериализации, т.е. сохраняемости объектов. Однако уровень предоставляемых возможностей варьируется в зависимости от вашего выбора; он зависит от включения определенных макросов объявления и реализации при создании классов – наследников CObject. Без сомнения, вы с этими макросами уже сталкивались, например в коде, который генерируют Wizard'ы. Пришла пора разобраться с ними более детально. Итак, на характер вашего класса, производного от CObject, вы можете влиять с помощью нескольких макросов. Существуют определенные пары макросов — один включается в объявление класса (имеет префикс DECLARE_), а соответствующий ему — в реализацию (префикс IMPLEMENT_). Первая пара макросов — это DECLARE_DYNAMIC|IMPLEMENT_DYNAMIC. С помощью включения этих макросов в код вашего класса вы можете включить одну из базовых функций CObject — способность узнавать класс объекта прямо во время выполнения программы. Для этого вы можете пользоваться функцией IsKindOf() в связке с макросом RUNTIME_CLASS, который возвращает указатель на структуру CRuntimeClass (где хранится вся информация о классе: имя, размер, версия, информация о базовом классе, указатель на конструктор объекта и т.д.) Следующая пара — DECLARE_DYNCREATE|IMPLEMENT_DYNCREATE аналогична первой, но к возможности получать информацию о классе добавляется еще и возможность создавать объекты этого класса во время выполнения. Объект создается функцией CreateObject структуры CRuntimeClass. Вот пример: CRunTimeClasspClass = RUNTIME_CLASS(СMyObject); // получаем ук-ль на структуру CRunTimeClass CObjectpNewObject= pClass->CreateObject(); // создаем новый объект нужного класса ASSERT(pNewObject->IsKindOf(RUNTIME_CLASS(CMyObject)); // проверяем класс объекта И, наконец, мы подошли к последней паре макросов DECLARE_SERIAL| IMPLEMENT_SERIAL. Преобразование в последовательную форму и обратно — сериализация — дает программисту возможность сохранения и восстановления объектов. Для того, чтобы воспользоваться этой возможностью, в классе-наследнике нужно перекрыть виртуальную функцию Serialize(). Из нее обязательно нужно сначала вызвать родительскую версию. Одна и та же функция используется как для сохранения, так и для восстановления объекта. Какую операцию нужно произвести, она определяет из своего единственного параметра ar типа CArchive. Вот пример: void CMyObject::Serialize(CArchive ar) { CObject::Serialize(ar); // вызываем версию базового класса if (ar.IsStoring()) // если сохраняем, { ar << something; // то сохранить что-то } else // а иначе { ar >> something; // восстановить } } Заметьте, что DECLARE_SERIAL|IMPLEMENT_SERIAL помимо сериализации включают и те возможности, которые дают две первые пары — это естественно, ведь если вы восстанавливаете объект, то вам понадобится возможность создать его во время выполнения программы. Например, приложению нужно сохранять и восстанавливать некоторый набор объектов различного типа. А для вызова соответствующего конструктора при восстановлении объекта нужно знать его тип. Механизм сериализации сохраняет- 1
- 2
- 3
- 4
- . . .
- последняя (262) »
Последние комментарии
1 час 35 минут назад
3 часов 4 минут назад
4 часов 19 секунд назад
1 день 2 часов назад
1 день 2 часов назад
1 день 3 часов назад