chitay-knigi.com » Разная литература » Интернет-журнал "Домашняя лаборатория", 2007 №6 - Усманов

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 192 193 194 195 196 197 198 199 200 ... 361
Перейти на страницу:

// Книга

typedef struct {

     char szAuthor[MAX_LENGTH]; // автор

     char szTitle[MAX_LENGTH]; // название

     int nYear; // год издания

} Book;

// Журнал

typedef struct {

     char szTitle[MAX LENGTH]; // название

     int nYear; // год выпуска

     int nNumber// номер;

} Journal;

// Массив изданий

typedef struct {

      int nPubldx; // индекс издания (1 — книга, 2 — журнал)

      void* pPub; // указатель на издание

} Pub;

Pub aPub[MAX ID];

int nNewID = 0; // индекс нового издания

// Прототипы глобальных функций

void DisplayBook(Book &book); // вывод описания книги

void DisplayJournal(Journal Sjournal); // вывод описания журнала

void NewBook(); // ввод данных о новой книге

void NewJournal; // ввод данных о новом журнале

// Главная функция

void main() {

     Book *pBook;

     Journal *pJournal;

     int nMenu, flag = 1;

     while(nNewID < MAX_ID && flag)

     {

// Вывод пунктов меню

          cout << "Новое издание. Введите: " << endl;

          cout << "1 для книги,n 2 для журналаn 3 — выход" << endl;

// Выбор пункта меню

         сin >> nMenu;

         switch (nMenu)

         { case 1: NewBook(); break;

         case 2: NewJournal(); break;

         default: flag = 0; break;

         }

     }

// Вывод описаний изданий

     for (int id = 0; id < nNewID; id++)

     {

         switch (aPub[id].nPubldx)

         { case 1: pBook = (Book*) aPub[id].pPub;

                  DisplayBook(*pBook);

                  delete pBook;

                  break;

            case 2: pJournal = (Journal*) aPub[id].pPub;

                   DisplayJournal(*pJournal);

                   delete pJournal;

                   break;

           }

      }

}

// Реализация глобальных функций

void DisplayBook(Book &book) {

     cout << "BOOK: " << endl;

     cout << "Author: " << book.szAuthor << endl;

     cout << "Title: " << book.szTitle << endl;

     cout << "Year: " << book.nYear << endl;

}

void DisplayJournal(Journal Sjournal) {

     cout «"JOURNAL: " << endl;

     cout <<"Title: " << journal.szTitle << endl;

     cout << "Year: " << journal.nYear << endl;

     cout << "Number: " << journal.nNumber << endl;

}

void NewBook() {

     char szBuffer[MAX LENGTH];

     int nY;

     Book* pBook = new Book;

     cout << "Author: ";

     cin >> szBuffer;

     strcpy(pBook —> szAuthor, szBuffer);

     cout << "Title: ";

     cin >> szBuffer;

     strcpy(pBook — > szTitle, szBuffer);

     cout << "Year: "; cin >> nY;

     pBook —> nYear = nY;

     aPub[nNewID].nPubldx = 1;

     aPub[nNewID++].pPub = pBook;

}

     void NewJournal() {

     char szBuffer[MAX_LENGTH];

     int nY, nN;

      Journal* pJournal = new Journal;

      cout << "Title: ";

      cin >> szBuffer;

      strcpy(pJournal —> szTitle, szBuffer);

      cout << "Year: "; cin >> nY;

      pJournal —> nYear = nY;

      cout << "Number: "; cin >> nN;

      pJournal —> nNumber = nN;

      aPub[nNewID].nPubldx = 2;

      aPub[nNewID++].pPub = pJournal;

}

Данный код содержит ряд недостатков, которые (хотя бы отчасти) можно объяснить стремлением придерживаться процедурного подхода

• Наличие нескольких глобальных функций и связанных с ними глобальных данных

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

• Хранение в массиве aPub не только указателя на издание (void* pPub), но и информации о типе издания (int nPubldx)

Информация о типе необходима для выполнения явного преобразования типа

pBook = (Book*) aPub[id].pPub,

pJournal = (Journal*) aPub[id].pPub,

которое необходимо использовать и при выводе описаний изданий и при освобождении динамически выделенной памяти.

Объектно-ориентированное программирование

Теперь рассмотрим объектную реализацию предыдущей программы. Проект включает в три класса: базовый класс CPubiication и производные от него классы CBоок и CJournal, главной функции в файле publications.срр реализуется основная бизнес-логика.

// Заголовочный файл CPublication.h для класса CPublication

#ifndef _CPUBLICATION_

#define _CPUBLICATION_

#define MAX LENGTH 100 // максимальное число символов в имени автора и названии публикации

// Базовый класс

class CPublication

{

public:

     CPublication (); // конструктор

     virtual ~CPublication(); // деструктор

     virtual void Display (); // вывод описания публикации

protected:

     char m_szTitle[MAX_LENGTH]; //название публикации

     int m_nYear; // год издания

};

#endif

Следующий файл содержит реализацию класса CPublication

// Файл CPublication.срр — реализация класса CPublication

#include "CPublication.h"

#include <iostream.h>

// Конструктор

CPublication::CPublication()

{

// Ввод года издания и названия

     cout << "Year: ";

     cin >> m_nYear;

     cout << "Title;";

     cin >> m_szTitle;

}

// Деструктор

CPublication::~CPublication ()

{

}

// Вывод описания публикации

void CPublication::Display()

{

     cout << "PUBLICATION: " << endl;

     cout << "Title: "<< m_szTitle << endl;

     cout << "Year: "<< m_nYear «endl;

}

Файлы CBook.h и CBook.cpp задают класс CBook.

// СВоок.h

#ifndef _СВООК_

#define _СВООК_

#include "CPublication.h"

class CBook: public CPublication // класс CBook — производный от CPublication

{

public:

     CBook(); //

1 ... 192 193 194 195 196 197 198 199 200 ... 361
Перейти на страницу:

Комментарии
Минимальная длина комментария - 25 символов.
Комментариев еще нет. Будьте первым.