Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Янг Майкл Дж. -> "Visual С++ 6. Полное руководство: В 2 т.(том1)" -> 113

Visual С++ 6. Полное руководство: В 2 т.(том1) - Янг Майкл Дж.

Янг Майкл Дж. Visual С++ 6. Полное руководство: В 2 т.(том1) — Бином, 2006. — 569 c.
Скачать (прямая ссылка): vicualcc2006t1.djvu
Предыдущая << 1 .. 107 108 109 110 111 112 < 113 > 114 115 116 117 118 119 .. 204 >> Следующая

Если файл открыт для записи (т.е. выбрана команда Save или Save As...), то функция IsStoring класса CArchive возвращает значение true, а если файл открыт для чтения (т.е. выбрана команда Open... или команда вызова последнего использованного файла из меню File), то функция IsStoring возвращает значение false. Следовательно, код операции вывода помещается внутри блока if, а код операции ввода - внутри блока else.
В программе MiniDraw класс документа хранит единственную переменную m_LineArray, управляющую множеством объектов класса CLine. Переменная m_LineArray имеет собственную функцию-член Serialize (наследуемую от класса СОЬАггау), которая вызывается для чтения или записи всех объектов класса CLine, хранимых в данной переменной. В результате функцию
// TODO: здесь добавьте код сохранения
else
// TODO: здесь добавьте код загрузки
CMiniDrawDoc: : Serialize можно дописать, просто добавив два обращения к функции СОЬАггау::Serialize.
1111111111111111111111111111111111111111111111111111111111111111 II Сериализация класса CMiniDrawDoc
void CMiniDrawDoc::Serialize(CArchiveS ar) {
if (ar.IsStoring())
(
// TODO: здесь добавьте код сохранения m_LineArray.Serialize (ar);
1
else
{
// TODO: здесь добавьте код загрузки m_LineArray.Serialize (ar) ;
1
)
При записи данных в файл функция СОЬАггау: : Serialize выполняет два основных действия для каждого объекта класса CLine.
1. Записывает в файл информацию о классе объекта.
2. Вызывает функцию Serialize объекта, записывающую данные объекта в файл.
При чтении данных из файла функция СОЬАггау: : Serialize выполняет два действия дчя каждого объекта класса CLine.
1. Читает информацию класса из файла, динамически создает объект соответствующего класса (CLine) и сохраняет указатель на объект.
2. Вызывает функцию Serialize объекта для чтения данных из файла во вновь созданный объект.
Необходимо обеспечить поддержку сериализации класса CLine. Для этого включите в его определение два макроса (declare_serial и implement_serial) и определите конструктор класса по умолчанию. Эти макрокоманды и конструктор позволяют функции СОЬАггау:: Serialize сохранить информацию класса в файле, а затем использовать ее для динамического создания объекта класса. Макрокоманды и конструктор обеспечивают выполнение первого пункта двух приведенных выше алгоритмов с помощью функции СОЬАггау: : Serialize.
Добавьте макрокоманду declare_serial и конструктор по умолчанию в определение класса CLine в файле MiniDrawDoc.h, как показано ниже.
class CLine : public CObject I
protected:
int m_Xl, m_Yl, m_X2, m_Y2; CLine () О
DECLARE SERIAL (CLine)
public
// оставшаяся часть определения класса CLine...
}
Имя класса передается макросу declare_serial как параметр. В файле MiniDrawDoc.cpp макрокоманда implementserial добавляется сразу перед определением функции CLine: : Draw.
1111111111111111п1111111пiиiиiп пiпi п и п и п пi iii 111111 ii Другие функции класса CMiniDrawDoc
IMPLEMENT_SERIAL (CLine, CObject, 1)
void CLine::Draw (CDC *PDC) {
PDC->MoveTo (m XI, m Yl); PDC->LineTo (m X2, m Y2); }
Первый параметр, переданный макросу implementserial, - это имя самого класса, а второй — имя базового класса. Третий параметр — это номер версии, идентифицирующий отдельную версию программы. Он сохраняется внутри записанного файла, прочитать который может только программа, указавшая такой же номер. Номер версии предотвращает чтение данных программой другой версии. Для текущей версии MiniDraw задан номер 1. В более поздних версиях он увеличивается при каждом изменении формата данных. Нельзя задавать номер версии -1.
Второе действие, необходимое для сериализации класса CLine, - это добавление в класс CLine функции Serialize, вызываемой в методе СОЬАггау: : Serialize для чтения или записи данных каждой строки. Добавьте объявление функции Serialize в раздел public определения класса CLine в файле MiniDrawDoc.h.
public:
CLine (int XI, int Yl, int X2, int Y2) {
m XI = XI
m ~Y1 = Yl
m_ ~X2 = X2
m. ~Y2 = Y2
}
void Draw (CDC *PDC);
virtual void Serialize (CArchiveu ar);
Добавьте определение функции Serialize в файл реализации MiniDrawDoc.cpp после определения CLine: : Draw.
void CLine::Serialize (CArchiveS ar) {
if (ar.IsStoringO )
ar « m_Xl « m_Yl « m_X2 « m_Y2;
else
ar » m_Xl » m_Yl » m_X2 » m Y2;
}
Примечание
Класс, объекты которого могут быть сериализоааны, должен прямо или косвенно порождаться от MFC-класса cobject.
Фактически, операции чтения и записи выполняет функция CLine: Serialize, а не одноименные функции других классов. Функция Serialize использует перегруженные операторы << и >> для записи переменных класса CLine в файл и для чтения их из файла соответственно. Эти операторы определяются классом CArchive и используются для чтения и записи данных различных типов.
Заключение. Как видно из кода ввода-вывода, добавленного в программу MiniDraw, объект класса, сохраняющий данные, обычно отвечает за их запись на диск и чтение с диска. Этот класс должен предоставлять функцию Serialize, обеспечивающую чтение и запись. Общий принцип объектно-ориентированного программирования состоит в том, что каждый объект работает с собственными данными. Например, объект может нарисовать, прочитать, сохранить себя или выполнить другие характерные операции с собственными данными. Для переменных, являющихся объектами класса, вызывается функция-член Serialize их собственного класса. Для переменных, не являющихся объектами, функция Serialize использует перегруженные операторы « и », предоставляемые классом CArchive.
Предыдущая << 1 .. 107 108 109 110 111 112 < 113 > 114 115 116 117 118 119 .. 204 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100