Реферат: Моделирование структуры книги

ОглавлениеВведение                                                                                    3Анализ и описание предметной области проекта               4 Разработка объектной модели                                               5Определение объектов и классов                                             5Подготовка словаря данных                                                     5 Определение атрибутов объектов                                         6Определение методов классов                                                 7Упрощение классов при использовании наследования и графическое изображениеобъектной модели                      7Реализация объектной модели на языке программирования C++                                                            9Реализация класса книги                                                            9Порождение объектов                                                               19 Вызов операций                                                                           20Использование наследования                                                  21Реализация зависимостей                                                       22Анализ полученных результатов и выводы                       23Снимок экрана программы                                                                             24Литература                                                                               25
Введение

Темой данной курсовойработы является изучение объектно-ориентированных возможностей языка C++ (номер варианта 34).Предметная область курсовой работы согласно варианту – моделирование структурыкниги.

В методическом приложениибыли приведены особенности предметной области, рассмотренной в данной работе, –в книге выделяются компоненты: страница, глава, раздел. По условию задачинеобходимо реализовать объектную модель книги и написать программу сиспользованием класса C++,который отражает структуру книги и наглядно демонстрирует эффективность использованияобъектно-ориентированной технологии разработки программ.

Для повышенияэффективности создания программных комплексов и сокращения времени, отводимогона проектирование и реализацию конечного продукта, фирма Microsoft рекомендует использоватьразработанную ею библиотеку классов MFC (MicrosoftFoundationClasses),поставляемую в составе среды разработки программ MicrosoftVisualC++ 6. Поэтому приложение,созданное в ходе написания данной курсовой работы, является приложением,использующем библиотеку MFC,и разработано в визуальной среде MicrosoftVisualC++ 6. Предназначение данногоприложения – наглядное представление в визуальной форме структуры книги.

<span Arial",«sans-serif»;mso-fareast-font-family: «Times New Roman»;mso-font-kerning:16.0pt;mso-ansi-language:RU;mso-fareast-language: RU;mso-bidi-language:AR-SA">
Анализ и описание предметной области проекта

Предметная область даннойкурсовой работы была выбрана в методическом приложении: моделирование структурыкниги (вариант №34).

Книга содержит текстовуюинформацию (в простейшем случае) и имеет древовидную структуру – книга состоитиз нескольких разделов, раздел состоит из нескольких глав, глава, в свою очередь,состоит из страниц. Особый компонент книги, облегчающий ее использование, –оглавление, имеющее также древовидную структуру. Недостаток бумажной книги –необходимость часто открывать страницы, содержащие оглавление, для определенияномеров нужных страниц, далее необходимо осуществлять поиск этих страниц поизвестным номерам, на что снова уходит некоторое время. В электронных книгах(например, созданных для просмотра с помощью программы AdobeAcrobatReader) оглавление всегда находится перед глазами читателяи переход на нужную страницу осуществляется простым щелчком мыши по элементу,соответствующему некоторой странице. Кроме того, в таких оглавленияхпоказываются все страницы, а не только первые страницы глав, что также упрощаетнавигацию по книге. И в бумажных, и в электронных книгах всегда присутствуетвозможность перевернуть одну страницу вперед или назад. Для упрощения задачи иосуществления совместимости с книгами, созданными для просмотра на ПК,ориентированных на текстовые операционные системы (типа DOS),страницу мы будем рассматривать как объект, содержащий исключительно текстовуюинформацию, отображаемую единым шрифтом и не содержащую никакогоформатирования. Таким образом, можно представить страницу как массив сконстантным количеством расположенных вертикально сверху вниз горизонтальныхстрок, содержащих константное количество символов (в случае использованиянемоноширинных шрифтов строки имеют постоянную длину, выраженную в физическихединицах: сантиметрах, дюймах, пикселях и т.п.).

<span Arial",«sans-serif»;mso-fareast-font-family: «Times New Roman»;mso-font-kerning:16.0pt;mso-ansi-language:RU;mso-fareast-language: RU;mso-bidi-language:AR-SA">
Разработка объектной моделиОпределение объектов и классов

Согласно модели приложения,используемой библиотекой MFC, любое SDI-приложениедолжно иметь определения следующих классов: класс приложения, порожденный отCWinApp, класс окна, порожденный от CFrameWnd, класс документа, порожденный отCDocument, и класс представления, порожденный от CView. Т.к. приложение дляпросмотра книг выполнено в стиле “Explorer”, то также определен класспредставления оглавления книги, порожденный от CTreeView. Кроме того, класс представлениястраницы книги порожден не непосредственно от класса CView, а от наследуемогоот CView класса – класса CListView. Т.е. страница книги имеет представление ввиде списка ее строк.

Класс, отражающий структурукниги, имеет название CBookClass. Определены классы коллекций разделов, глав истраниц – класс CRazdels, класс CGlavas и класс CPages соответственно; а такжеклассы собственно раздела, главы и страницы – класс CRazdel, класс CGlava икласс CPage соответственно.

Подготовка словаря данных

Приложение– глобальный объект классаприложения, используемый для согласования работы объектов других стандартныхклассов MFCи для разрешения ссылок внутри одних объектов надругие объекты.

Окно приложения – объект визуальногопредставления приложения, организовывающий взаимное расположение визуальныхкомпонентов программы на экране и реализующий стандартный интерфейсвзаимодействия пользователя с программой.

Документ– информация, которуюпользователь может сохранять в процессе работы с приложением и затем считывать.

Представление– средства представлениядокумента пользователю в процессе выполнения приложения.

Положенная в основу MFCконцепция документ/представление позволяет отделить данные от средств, спомощью которых пользователь имеет возможность просмотреть эти данные иманипулировать ими. Объекты-документы ответственны за хранение, загрузку ивыгрузку данных, а объекты-представления, которые представляют собой те жеокна, позволяют пользователю просматривать данные на экране и редактировать ихсоответственно логике работы приложения. Объект класса представления содержитуказатель на объект класса документа, который используется для доступа кчленам-переменным этого класса, где собственно и хранятся данные.

Значения терминов книга,раздел, глава, страница, строка и оглавление очевидны и не подлежат объяснению.

<span Arial",«sans-serif»; mso-fareast-font-family:«Times New Roman»;mso-ansi-language:RU;mso-fareast-language: RU;mso-bidi-language:AR-SA">
Определение атрибутов объектов

В классе документаопределен открытый атрибут – объект класса CBookClass:

class CBookDoc: public CDocument

{

public:

         CBookClass m_Book;

};

В класс документа включеноткрытый член с тем, чтобы не затруднять доступ к нему из объектов классовпредставления. Определения атрибутов других классов соответствуют классическомуобъектно-ориентированному подходу, который требует включать в класс закрытыеили защищенные члены-переменные и открытые члены-функции считывания имодификации этих переменных.

Классы книги, раздела, главыи страницы имеют закрытую член-переменную m_Name класса CString. Т.к. книгаимеет древовидную структуру, то классы книги, раздела и главы соответствуютветвям дерева, а класс страницы – листу этого дерева. Поэтому классы-ветвисодержат член-переменную класса коллекции более мелких объектов (книга содержитколлекцию разделов, глава – коллекцию страниц), а страница содержитчлен-переменную – массив объектов класса CString (строки этой страницы). Классыраздела и главы содержат члены-переменные типа WORD– номера первой и последнейстраниц, принадлежащих данному разделу или главе. Класс раздела содержит такженомера первой и последней глав, принадлежащих этому разделу.

В классе книги определензакрытый атрибут типа WORD, хранящий номер страницы,которая в данный момент времени просматривается пользователем. Кроме того, вклассе книги определены члены-указатели на элементы управления CTreeCtrl иCListCtrl, позволяющие осуществлять при чтении книги переход от одной страницык другой. Для этой же цели в классе страницы определена член-переменная –указатель на элемент дерева – типа HTREEITEM.

Для перебора всех страницкниги удобно пользоваться не деревом, а массивом страниц. Поэтому в классекниги определена член-переменная – массив указателей на страницы книги – MFC-классаCPtrArray.

<span Arial",«sans-serif»; mso-fareast-font-family:«Times New Roman»;mso-ansi-language:RU;mso-fareast-language: RU;mso-bidi-language:AR-SA">
Определение методов классов

Помимо открытыхчленов-функций, осуществляющих чтение и модификацию закрытых членов-переменных,в классах, используемых в программе, определены и другие члены-функции.

В классе книги определены открытые члены-функции,осуществляющие переход при чтении книги к предыдущей и последующей страницам.Кроме того, в этом классе определена закрытая член-функция RenewCtrls(),которая вызывается вышеупомянутыми функциями при переходе к другой странице.Данная функция вызывает глобальные функции RenewTree() и RenewList(), которыеобновляют визуальное содержание представлений оглавления и страницысоответственно.

Классы коллекций разделов,глав и страниц (CRazdels, CGlavas и CPages) имеют открытые члены-функцииDeleteRazdels(), DeleteGlavas() и DeletePages() соответственно. Данныечлены-функции осуществляют освобождение памяти, выделенной под хранение книги,при открытии другой книги или завершении работы программы.

В классе книги перегруженыконструктор и деструктор по умолчанию. Конструктор обнуляет номер текущейстраницы для того, чтобы при открытии новой книги автоматически отображаласьпервая страница. Деструктор запускает механизм освобождения памяти.

Упрощение классов при использовании наследования и графическое изображениеобъектной модели

Объектно-ориентированныйподход в программировании имеет одну очень привлекательную черту – возможностьповторного использования уже разработанного кода. Во-первых, можно использоватьклассы, созданные другими разработчиками, не заботясь о деталях реализацииметодов внутри класса. Примером могут служить сотни классов из библиотеки MFC. Ноболее существенные преимущества дает повторное использование кода, реализуемоечерез механизм наследования.

Класс, использующий коддругого класса, называется производным или подклассом. Класс,который предоставляет свой код другому классу, называется базовым или суперклассом.Если есть необходимость предоставить методам порожденного класса возможностьпрямого доступа к члену-переменной базового класса, вместо квалификаторадоступа privateможно использовать квалификатор protected. Может оказаться, что методы базового класса, унаследованные порожденнымклассом, не совсем соответствуют специфике последнего и нуждаются вопределенной модификации. Для этого потребуется разработать отдельный методИмя_Класса:: Метод(). Это и есть перегрузка методов базового класса. Еслижелательно, чтобы метод Имя_Класса:: Метод() выполнял то же, что и методбазового класса, а затем и еще нечто, то наилучшим способом достичь такогорезультата будет вызов Имя_Базового_Класса:: Метод() внутри Имя_Класса:: Метод().Но при этом нужно использовать полное имя метода базового класса, т.е. именноИмя_Базового_Класса:: Метод().

В приложении классы книги,раздела, главы и страницы унаследованы от CObject. Это необходимо дляреализации механизма загрузки документа из файла – метод Serialize() в этихклассах перегружается также, как и в классе документа:

void CBookDoc::Serialize(CArchive& ar)

{

         m_Book.Serialize(ar);

}

Классы CRazdels, CGlavas иCPages унаследованы от класса CObArray. Поэтому для объектов этих классов можновызывать все члены-функции, присущие классу массива объектов.

Объектная модель книги

<img src="/cache/referats/16762/image002.jpg" v:shapes="_x0000_i1025">

<img src="/cache/referats/16762/image004.jpg" v:shapes="_x0000_i1026">

<img src="/cache/referats/16762/image006.jpg" v:shapes="_x0000_i1027">

<img src="/cache/referats/16762/image008.jpg" v:shapes="_x0000_i1028">

<span Arial",«sans-serif»;mso-fareast-font-family: «Times New Roman»;mso-font-kerning:16.0pt;mso-ansi-language:RU;mso-fareast-language: RU;mso-bidi-language:AR-SA">
Реализация объектной модели на языке программирования C++Реализация класса книги

BookClass.h:

#if _MSC_VER > 1000

#pragma once

#endif // _MSC_VER > 1000

#include «Razdels.h»

class CBookClass;

extern void RenewTree(CTreeCtrl*,CBookClass*);

extern void RenewList(CListCtrl*,CBookClass*);

class CBookClass: public CObject

{

DECLARE_SERIAL(CBookClass)

private:

         CRazdelsm_Razdels;

         CPtrArraym_pPages;

         CTreeCtrl*pTreeCtrl;

         CListCtrl*pListCtrl;

         CStringm_Name;

         WORDm_ActivePage;

         voidRenewCtrls()

         {

                   RenewTree(pTreeCtrl,this);

                   RenewList(pListCtrl,this);

         }

public:

         CRazdels*GetRazdels()

         {

                   return&m_Razdels;

         }

         CPtrArray*GetPages()

         {

                   return&m_pPages;

         }

         voidSetTreeCtrl(CTreeCtrl* TreeCtrl)

         {

                   pTreeCtrl=TreeCtrl;      }

         voidSetListCtrl(CListCtrl* ListCtrl)

         {

                   pListCtrl=ListCtrl;

         }

         CString*GetName()

         {

                   return&m_Name;

         }

         WORD GetActivePage()

         {

                   returnm_ActivePage;

         }

         voidSetActivePage(WORD Page)

         {

                   m_ActivePage=Page;

                   RenewList(pListCtrl,this);

         }

         voidSetPreviousActivePage()

         {

                   if(m_ActivePage>0)

                   {

                            m_ActivePage--;

                            RenewCtrls();

                   }

         }

         voidSetNextActivePage()

         {

                   if(m_ActivePage+1<m_pPages.GetSize())

                   {

                            m_ActivePage++;

                            RenewCtrls();

                   }

         }

         CBookClass();

         ~CBookClass();

         voidSerialize(CArchive&);

};

BookClass.cpp:

#include «stdafx.h»

#include «BookClass.h»

IMPLEMENT_SERIAL(CBookClass,CObject,0)

CBookClass::CBookClass()

{

         m_ActivePage=0;

}

CBookClass::~CBookClass()

{

         m_Razdels.DeleteRazdels();

}

void CBookClass::Serialize(CArchive& ar)

{

         m_Razdels.DeleteRazdels();

         m_pPages.RemoveAll();

         m_ActivePage=0;

         CObject::Serialize(ar);

         if(ar.IsLoading())

         {

                   ar>>m_Name;

                   WORDCount,Counter;

                   ar>>Count;

                   for(Counter=0;Counter<Count;Counter++)

                   {

                            CRazdel*Razdel=new CRazdel;

                            Razdel->Serialize(ar);

                            m_Razdels.Add(Razdel);

                   }

                   for(Counter=0;Counter<m_Razdels.GetSize();Counter++)

                   {

                            CRazdel*Razdel=(CRazdel*)m_Razdels.GetAt(Counter);

                            for(WORDCounter2=0;Counter2<Razdel->GetGlavas()->GetSize();Counter2++)

                            {

                                      CGlava*Glava=(CGlava*)Razdel->GetGlavas()->GetAt(Counter2);

                                      for(WORDCounter3=0;Counter3<Glava->GetPages()->GetSize();Counter3++)

                                               m_pPages.Add(Glava->GetPages()->GetAt(Counter3));

                            }

                   }

         }

}

Razdels.h:

#if _MSC_VER > 1000

#pragma once

#endif // _MSC_VER > 1000

#include «Razdel.h»

class CRazdels: public CObArray

{

public:

         voidDeleteRazdels();

};

Razdels.cpp:

#include «stdafx.h»

#include «Razdels.h»

void CRazdels::DeleteRazdels()

{

         WORDCounter;

         for(Counter=0;Counter<GetSize();Counter++)

         {

                   CRazdel*Razdel=(CRazdel*)GetAt(Counter);

                   Razdel->GetGlavas()->DeleteGlavas();

                   deleteRazdel;

         }

         RemoveAll();

}

Razdel.h:

#if _MSC_VER > 1000

#pragma once

#endif // _MSC_VER > 1000

#include «Glavas.h»

class CRazdel: public CObject

{

DECLARE_SERIAL(CRazdel)

private:

         CGlavasm_Glavas;

         CStringm_Name;

         WORDm_FirstGlava;

         WORDm_LastGlava;

         WORDm_FirstPage;

         WORDm_LastPage;

public:

         CGlavas*GetGlavas()

         {

                   return&m_Glavas;

         }

         CString*GetName()

         {

                   return&m_Name;

         }

         WORDGetFirstGlava()

         {

                   returnm_FirstGlava;

         }

         voidSetFirstGlava(WORD FirstGlava)

         {

                   m_FirstGlava=FirstGlava;

         }

         WORDGetLastGlava()

         {

                   returnm_LastGlava;

         }

         voidSetLastGlava(WORD LastGlava)

         {

                   m_LastGlava=LastGlava;

         }

         WORDGetFirstPage()

         {

                   returnm_FirstPage;

         }

         voidSetFirstPage(WORD FirstPage)

         {

                   m_FirstPage=FirstPage;

         }

         WORDGetLastPage()

         {

                   returnm_LastPage;

         }

         voidSetLastPage(WORD LastPage)

         {

                   m_LastPage=LastPage;

         }

         CRazdel(){};

         voidSerialize(CArchive&);

};

Razdel.cpp:

#include «stdafx.h»

#include «Razdel.h»

IMPLEMENT_SERIAL(CRazdel,CObject,0)

void CRazdel::Serialize(CArchive& ar)

{

         CObject::Serialize(ar);

         if(ar.IsLoading())

         {

                   ar>>m_Name>>m_FirstGlava>>m_LastGlava>>m_FirstPage>>

m_LastPage;

                   WORDCount,Counter;

                   ar>>Count;

                   for(Counter=0;Counter<Count;Counter++)

                   {

                            CGlava*Glava=new CGlava;

                            Glava->Serialize(ar);

                            m_Glavas.Add(Glava);

                   }

         }

}

Glavas.h:

#if _MSC_VER > 1000

#pragma once

#endif // _MSC_VER > 1000

#include «Glava.h»

class CGlavas: public CObArray

{

public:

         voidDeleteGlavas();

};

Glavas.cpp:

#include «stdafx.h»

#include «Glavas.h»

void CGlavas::DeleteGlavas()

{

         WORDCounter;

         for(Counter=0;Counter<GetSize();Counter++)

         {

                   CGlava*Glava=(CGlava*)GetAt(Counter);

                   Glava->GetPages()->DeletePages();

                   deleteGlava;

         }

         RemoveAll();

}

Glava.h:

#if _MSC_VER > 1000

#pragma once

#endif // _MSC_VER > 1000

#include «Pages.h»

class CGlava: public CObject

{

DECLARE_SERIAL(CGlava)

private:

         CPagesm_Pages;

         CStringm_Name;

         WORDm_FirstPage;

         WORDm_LastPage;

public:

         CPages*GetPages()

         {

                   return&m_Pages;

         }

         CString*GetName()

         {

                   return&m_Name;

         }

         WORDGetFirstPage()

         {

                   returnm_FirstPage;      }

         voidSetFirstPage(WORD FirstPage)

         {

                   m_FirstPage=FirstPage;

         }

         WORDGetLastPage()

         {

                   returnm_LastPage;

         }

         voidSetLastPage(WORD LastPage)

         {

                   m_LastPage=LastPage;

         }

         CGlava(){};

         voidSerialize(CArchive&);

};

Glava.cpp:

#include «stdafx.h»

#include «Glava.h»

IMPLEMENT_SERIAL(CGlava,CObject,0)

void CGlava::Serialize(CArchive& ar)

{

         CObject::Serialize(ar);

         if(ar.IsLoading())

         {

                   ar>>m_Name>>m_FirstPage>>m_LastPage;

                   WORDCount,Counter;

                   ar>>Count;

                   for(Counter=0;Counter<Count;Counter++)

                   {

                            CPage*Page=new CPage;

                            Page->Serialize(ar);

                            m_Pages.Add(Page);

                  }

         }

}

Pages.h:

#if _MSC_VER > 1000

#pragma once

#endif // _MSC_VER > 1000

#include «Page.h»

class CPages: public CObArray

{

public:

         voidDeletePages();

};

Pages.cpp:

#include «stdafx.h»

#include «Pages.h»

void CPages::DeletePages()

{

         WORDCounter;

         for(Counter=0;Counter<GetSize();Counter++)

         {

                   CPage*Page=(CPage*)GetAt(Counter);

                   deletePage;

         }

         RemoveAll();

}

Page.h:

#if _MSC_VER > 1000

#pragma once

#endif // _MSC_VER > 1000

#define CountOfStrings 37

class CPage: public CObject

{

DECLARE_SERIAL(CPage)

private:

         CStringm_Strings[CountOfStrings];

         CStringm_Name;

         HTREEITEMm_TreeItem;

public:

         CString*GetString(BYTE Index)

         {

                   return&m_Strings[Index];

         }

         CString*GetName()

         {

                   return&m_Name;

         }

         HTREEITEMGetTreeItem()

         {

                   returnm_TreeItem;

         }

         voidSetTreeItem(HTREEITEM TreeItem)

         {

                   m_TreeItem=TreeItem;

         }

         CPage(){};

         voidSerialize(CArchive&);

};

Page.cpp:

#include «stdafx.h»

#include «Page.h»

IMPLEMENT_SERIAL(CPage,CObject,0)

void CPage::Serialize(CArchive& ar)

{

         CObject::Serialize(ar);

         if(ar.IsLoading())

         {

                   ar>>m_Name;

                   BYTECounter;

                   for(Counter=0;Counter<CountOfStrings;Counter++)

                            ar>>m_Strings[Counter];

         }

}

 
Порождение объектов

В файле Book.cppобъявляется глобальная переменная – объект класса приложения CBookApp:

CBookApp theApp;

В перегруженнойфункции-члене InitInstance() класса CBookApp создаются объекты классовдокумента, окна и представления оглавления:

BOOL CBookApp::InitInstance()

{

         CSingleDocTemplate*pDocTemplate;

         pDocTemplate = new CSingleDocTemplate(

                   IDR_MAINFRAME,

                   RUNTIME_CLASS(CBookDoc),

                   RUNTIME_CLASS(CMainFrame),

                   RUNTIME_CLASS(CLeftView));

         AddDocTemplate(pDocTemplate);

         return TRUE;

}

Класс окна CMainFrameсодержит защищенный атрибут класса CSplitterWnd, предоставляющий доступ кпредставлению страницы посредством вызова открытой член-функции классаCMainFrame:

class CMainFrame: public CFrameWnd

{

protected:

         CSplitterWndm_wndSplitter;

public:

         CBookView* GetRightPane();

};

Объект класса книги являетсяоткрытым атрибутом класса документа:

class CBookDoc: public CDocument

{

public:

         CBookClass m_Book;

};

Все структурные элементыкниги (разделы, главы и страницы) создаются в момент загрузки файла книги сдиска через оператор new:

CRazdel* Razdel=new CRazdel;

m_Razdels.Add(Razdel);

<span Arial",«sans-serif»; mso-fareast-font-family:«Times New Roman»;mso-ansi-language:EN-US;mso-fareast-language: RU;mso-bidi-language:AR-SA">
Вызов операций

Вызов операций для объектовв C++ может быть организован двумя способами:

1)<span Times New Roman"">   

Если требуется вызватьоперацию для переменной, являющейся объектом какого-либо класса, тоиспользуется оператор .*:

Object.MemberFunc();

2)<span Times New Roman"">   

Если переменная являетсяуказателем на объект класса, то доступ к методам, поддерживаемым даннымклассом, организовывается через оператор ->*:

pObject->MemberFunc();

Т.к. объект класса книгиявляется открытым атрибутом класса документа, то доступ к членам класса книгиосуществляется через указатель на объект класса документа. Т.о., чтобы вызватьфункцию-член класса CBookClass, необходимо получить вначале указатель на объекткласса CBookDoc:

CBookDoc* pDoc = GetDocument();

pDoc->m_Book.SetTreeCtrl(&refCtrl);

Если члены-функциивызываются внутри их класса, то вызов этих функций осуществляется напрямую безуказания имени класса. Например, внутри функции CRazdels::DeleteRazdels()осуществляется вызов членов-функций, наследуемых от базового класса CObArray:

void CRazdels::DeleteRazdels()

{

         WORDCounter;

         for(Counter=0;Counter<GetSize();Counter++)

         {

                   CRazdel*Razdel=(CRazdel*)GetAt(Counter);

                   Razdel->GetGlavas()->DeleteGlavas();

                   deleteRazdel;

         }

         RemoveAll();

}

<span Arial",«sans-serif»; mso-fareast-font-family:«Times New Roman»;mso-ansi-language:RU;mso-fareast-language: RU;mso-bidi-language:AR-SA">
Использование наследования

Согласно концепцииобъектно-ориентированного программирования функция загрузки файла книги с дискадолжна быть инкапсулирована в самом классе CBookClass. Основные этапы созданиякласса, который может самостоятельно организовать сохранение-восстановление (вдокументации на MFCприменяется термин serialize-сериализация) собственныхчленов-переменных перечислены ниже:

1.Объявить класс какпроизводный от CObject.

2.В объявление классавключить макрос DECLARE_SERIAL.

3.В реализацию классавключить макрос IMPLEMENT_SERIAL.

4.Перегрузить метод Serialize(),унаследованный от базового класса.

5.Перегрузить для новогокласса среди прочих конструктор по умолчанию.

Т.о. в нашем случаенеизбежно приходится применять механизм наследования классов. Как только мыобъявили класс книги производным от CObject, нам разрешается использоватьсериализацию данных.

Кроме выполнениявышеуказанных пяти пунктов необходимо также перегрузить метод Serialize()и для класса документа:

void CBookDoc::Serialize(CArchive& ar)

{

         m_Book.Serialize(ar);

}

Также как и метод Serialize()класса документа перегруженный метод Serialize() класса книги не выполняетнепосредственное чтение текста книги из файла. Этот метод извлекает из файлатолько лишь служебную информацию, определяя название книги и количество ееразделов. Далее в цикле создаются объекты класса раздела, им делегируетсязагрузка из файла разделов, затем происходит добавление разделов в коллекциюразделов книги. Аналогично раздел, загрузив служебную информацию раздела,делегирует загрузку глав классу главы; глава, в свою очередь, делегируетзагрузку страниц классу страницы; а уже страница вызывает оператор загрузки изархива, определенный в MFC-классе CString.

<span Arial",«sans-serif»; mso-fareast-font-family:«Times New Roman»;mso-ansi-language:RU;mso-fareast-language: RU;mso-bidi-language:AR-SA">
Реализация зависимостей

Здесь подробноостановимся на механизме «перелистывания» страниц, т.е. на переходе к предыдущейи последующей страницам. При работе с определенными элементами меню, кнопкамипанели инструментов или при нажатии специальных виртуальных клавиш в программеосуществляется «перелистывание» одной страницы вперед или назад. При этомуправление передается членам-функциям класса документа OnPagedown() иOnPageup(). Эти функции вызывают члены-функции класса книги SetNextActivePage()и SetPreviousActivePage(), которые после обновления номера активной страницывызывают закрытую член-функцию класса книги RenewCtrls(). Эта функция вызываетглобальные функции RenewTree() и RenewList(), передавая им в качествеаргументов указатели на элементы управления, отвечающие за отображение книги наэкране, и указатель на объект книги. Данные глобальные функции, получив доступк активной странице через указатель на объект книги, обновляют отображенияоглавления и страницы в соответствии с номером активной страницы.

Для реализации зависимостимежду элементом просмотрового окна дерева оглавления и класса книги в классе страницыопределен атрибут – указатель на элемент дерева:

class CPage: public CObject

{

private:

         HTREEITEM m_TreeItem;

};

Данный указатель позволяетпри щелчке мыши по номеру страницы в оглавлении отображать страницу с этимномером, а при «перелистывании» страниц – выделять в оглавлении номер активнойстраницы. Последнее осуществляется через вызов вышеупомянутой функцииRenewTree():

void RenewTree(CTreeCtrl* TreeCtrl,CBookClass* Book)

{

         CPage* Page=(CPage*)Book->GetPages()->GetAt(Book->

GetActivePage());

         TreeCtrl->Select(Page->GetTreeItem(),TVGN_CARET);

}

<span Arial",«sans-serif»;mso-fareast-font-family: «Times New Roman»;mso-font-kerning:16.0pt;mso-ansi-language:RU;mso-fareast-language: RU;mso-bidi-language:AR-SA">
Анализ полученных результатов и выводы

В ходе изученияобъектно-ориентированных возможностей языка C++ была разработанапрограмма, активно использующая объектно-ориентированные технологии создания программныхкомплексов, включая Microsoft Foundation Classes. Данные технологии позволяют вкороткий срок за счет экономии времени на этапах проектирования и реализацииобъектной модели создавать довольно сложные программные продукты с богатымифункциональными возможностями. Это обусловлено двумя причинами:

1)Нет необходимости«изобретать ве

еще рефераты
Еще работы по программированию, базе данных