Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пособие-ООП - копия.doc
Скачиваний:
20
Добавлен:
17.08.2019
Размер:
907.78 Кб
Скачать

Организационная структура программы

Для каждого класса рекомендуют иметь два файла: файл заголовков или файл интерфейса и файл кодов или файлом реализации.

В нашей программе будем иметь: для класса ind - файлы index.hpp и index.cpp, для класса akt - akt.hpp и akt.cpp, для класса cena - cena.hpp и cena.cpp, для класса ved - vedom.hpp и vedom.cpp.

Файл управления (upr.cpp) содержит внешние функции (main, menu, podmenu), необходимые для управления программой.

3.3Проектирование файлов интерфейсов классов. Лекция № 13. Файл интерфейса базового класса

Спроектируем базовый класс ind. Поместим index и kol в часть private, т.к. они используется только элементами-функциями данного класса, а im_f и элементы-функции - в часть public, т.к. они используются в классах akt, cena, ved.

Спроектируем прототипы элементов-функций класса ind:

  • void init_ind(int,char*); - инициализирует (создает) элемент индексного массива; принимает номер записи и значение ключа записи;

  • void init_kol(int); - инициализирует кол-во элементов массива;

  • int dob_ind(char*); - поиск номера добавляемой записи; принимает значение ключа записи, возвращает номер записи файла;

  • int poisk_ind(char*,int,int&); - поиск номера искомой записи; принимает значение ключа записи, индекс элемента начала поиска; возвращает номер записи файла и соответствующий индекс элемента;

  • void cor_ind(int,char*); - корректирует элемент индексного массива; принимает индекс элемента и значение ключа записи.

//файл интерфейса класса ind-index.hpp

#ifndef index_hpp

#define index_hpp

#include <conio.h>

#include <iostream.h>

#include <string.h>

const int max_mass=100;

const int max_pole=10;

class ind //определение базового класса

{

private: //закрытые элементы класса

struct tip_index //индексный массив

{

char kluch[max_pole]; //ключ записи

int nomer; //номер записи в файле данных

} index[max_mass];

int kol; //кол-во элементов индексного массива

public: //защищенные элементы класса

char* imf; //имя файла данных

ind(char* im):imf(im) {kol=0;}//конструктор базового класса

void init_ind(int,char*); //инициализация элемента массива

void init_kol(int); //инициализ. количества элементов

int dob_ind(char*); //добавление нового элемента

int poisk_ind(char*,int,int&);//поиск элемента массива

void cor_ind(int,char*); //корректировка массива

};

#endif

Файлы интерфейсов производных классов

Рассмотрим производные классы akt и cena. Элементы-данные этих классов наследуются классом ved, и поэтому, поместим их в часть protected. Так как элементы-функции formecran, vvod, vyvod вызываются только функциями данного класса, разместим их в части private. Элементы-функции init, sozdanie, correct будут вызываться из файла управления через объект класса, и, согласно правилам доступа, должны быть расположены в части public. Элементы-функции zapis_zap и chtenie_zap используются функциями этих классов, а также - класса ved. Поэтому, поместим их в часть protected.

//файл интерфейса класса akt - akt.hpp

#ifndef akt_hpp

#define akt_hpp

#include <fstream.h>

#include <stdlib.h>

#include <dos.h>

#include "index.hpp"

class akt : public ind //определение производного класса akt

{ //простое наследование с атрибутом public

protected: //защищенные элементы класса

char tabn[10]; //табельный номер рабочего

char fio[30]; //ф.и.о.

char vid[10]; //вид выполненной работы

float objem; //объем выполненной работы

public: //открытые элементы класса

akt(char* im):ind(im) //конструктор производного класса akt

{ //вызывает конструктор базового класса

tabn[0]='\0'; //и инициализирует собственные элементы

fio[0]='\0';

vid[0]='\0';

objem=0;

} //прототипы элементов-функций класса:

void init(); //инициализация индексного массива

void sozdanie(); //ввод новых документов и запись в файл

void correct(int); //корректировка (замена, удаление)

protected:

void zapis_zap(int); //запись записи в файл

void chtenie_zap(int);//чтение записи из файла

private: //закрытые элементы-функции класса

void formecran(char* podmenu);//вывод формы документа

void vvod(); //ввод содержимого документа

void vyvod(); //вывод содержимого документа

};

#endif

Может возникнуть вопрос - почему выбран атрибут наследования public? Если выбрать private, то элементы-функции класса ind становятся в классах akt и cena private. Доступ к ним в этих классах есть, но они становятся закрытыми для дальнейшего наследования и недоступны в классе ved. А ведь функция sozdanie класса ved, выполняющая обработку файлов, должна использовать элементы класса ind. Именно поэтому, необходимо использовать public.

//файл интерфейса класса cena - cena.hpp

#ifndef cena_hpp

#define cena_hpp

#include <fstream.h>

#include <stdlib.h>

#include <dos.h>

#include "index.hpp"

class cena : public ind //определение производного класса cena

{ //простое наследование с атрибутом public

protected: //защищенные элементы класса

char vid[10]; //вид работы

char naim[30]; //наименование работы

float rascenka; //расценка работы

public: //открытые элементы класса

cena(char* im):ind(im)//конструктор

{ //вызывает конструктор базового класса

vid[0]='\0'; //и инициализирует собственные элементы

naim[0]='\0';

rascenka=0;

} //прототипы элементов-функций класса:

void init(); //инициализация индексного массива

void sozdanie(); //ввод новых документов и запись в файл

void correct(int); //корректировка (замена, удаление)

protected:

void zapis_zap(int); //запись записи в файл

void chtenie_zap(int);//чтение записи из файла

private: //закрытые элементы класса

void formecran(char* podmenu);//вывод формы документа

void vvod(); //ввод содержимого документа

void vyvod(); //вывод содержимого документа

};

#endif

Рассмотрим класс ved, являющийся производным от двух классов akt и cena. Элементы-данные класса stoim, itog и элемент-функция formecran, используемые только функциями данного класса, разместим в части private. Функция sozdanie будет вызываться из файла управления через объект класса ved, и, согласно правилам доступа, должна быть расположена в части public.

//файл интерфейса класса ved - vedom.hpp

#ifndef vedom_hpp

#define vedom_hpp

#include <fstream.h>

#include <iomanip.h>

#include <stdlib.h>

#include <dos.h>

#include "akt.hpp"

#include "cena.hpp"

class ved : public akt,public cena //определение производного

{ //класса ved, множественное наследование

private: //закрытые элементы класса

float stoim; //стоимость работы

float itog; //итоговая стоимость всех работ рабочего

public: //открытые элементы класса

ved(char* im1,char* im2):akt(im1),cena(im2)//конструктор

{ //вызывает конструкторы базовых классов

stoim=itog=0; //akt и cena,иниц. собственные элементы

} //прототипы элементов-функций:

void sozdanie(); //расчет и вывод документов

private: //закрытый элемент класса

void formecran(char*);//вывод формы документа

};

#endif

Дадим объяснение тому, почему выбран атрибут наследования public? Будем вызывать в файле управления элементы-функции классов с помощью переменной obj, объекта класса ved. Если выбрать атрибут private, то объект obj будет иметь доступ только к собственным элементам из части public (функция sozdanie), а доступ к наследуемым элементам (функции init, sozdanie, correct) будет закрыт. Следовательно, выберем атрибут public.