- •Оглавление
- •1 Основные методы программирования. Лекция №2 5
- •2 Методы объектно-ориентированного программирования. Лекция №6. 15
- •2.4 Вопросы по теме 54
- •3 Объектно-ориентированное проектирование. Лекция №12 55
- •3.4 Вопросы по теме 74
- •Введение. Лекция №1.
- •1Основные методы программирования. Лекция №2
- •1.1Процедурное программирование Методы процедурного программирования
- •Этапы разработки программ. Лекция 3.
- •1.2Объектно-ориентированное программирование Лекция №4
- •Этапы разработки оо программ. Лекция №5
- •Конструкторы и деструкторы. Лекция №7.
- •Друзья класса
- •2.2Наследование. Лекция №8
- •Производный класс
- •Простое наследование
- •Множественное наследование. Лекция №9
- •Виртуальные базовые классы
- •2.3Полиморфизм. Лекция №10
- •Перегрузка операций
- •Преобразования типов, определяемые классом
- •Перегрузка функций.
- •Чистый полиморфизм
- •Виртуальные элементы-функции
- •Абстрактные классы. Лекция №11.
- •Параметрический полиморфизм
- •Шаблоны функций
- •Шаблоны классов
- •2.4Вопросы по теме
- •3Объектно-ориентированное проектирование. Лекция №12
- •3.1Концепция объектно-ориентированного проектирования
- •3.2Проектирование структурной схемы программы Составление начальной иерархии и структуры классов
- •Реорганизация иерархии и структуры классов
- •Организационная структура программы
- •3.3Проектирование файлов интерфейсов классов. Лекция № 13. Файл интерфейса базового класса
- •Файлы интерфейсов производных классов
- •Файл управления
- •3.4Вопросы по теме
- •Общие моменты разработки программы на основе объектно-ориентированного подхода
- •Приложение а
Организационная структура программы
Для каждого класса рекомендуют иметь два файла: файл заголовков или файл интерфейса и файл кодов или файлом реализации.
В нашей программе будем иметь: для класса 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.