lab4 (Лабораторная работа №4)
Описание файла
Файл "lab4" внутри архива находится в следующих папках: Лабораторная работа №4, Лаба4, Lab_4. Документ из архива "Лабораторная работа №4", который расположен в категории "". Всё это находится в предмете "объектно-ориентированное программирование (ооп)" из 3 семестр, которые можно найти в файловом архиве МГТУ им. Н.Э.Баумана. Не смотря на прямую связь этого архива с МГТУ им. Н.Э.Баумана, его также можно найти и в других разделах. Архив можно найти в разделе "лабораторные работы", в предмете "объектно-ориентированное программирование (ооп)" в общих файлах.
Онлайн просмотр документа "lab4"
Текст из документа "lab4"
Московский государственный технический университет
им. Н.Э. Баумана
Лабораторная работа №4
по курсу ПППО
«Наследование, виртуальные функции и абстрактные классы»
Вариант №26
7
(количество листов)
Выполнил:
студент группы ИУ5-62
Суслов А.Ю.
МОСКВА 2007
-
Цель работы
Целью лабораторной работы является дополнительное изучение оболочки (IDE) системы программирования BC 3.1 C++ , способов наследования классов, использование виртуальных функций, понятий абстрактного класса и виртуального вызова функций. Студенты создают свои классы и исследуют механизмы вызова виртуальных функций. Учатся проектировать собственные классы и отображать результаты на диаграммах классов и объектов.
Код задания: 1B, 2.2В, 3.1В
-
Порядок работы
-
Продолжить изучение оболочки BC 3.1 C++ в интерактивном режиме( всех пунктов меню и окон настройки работы оболочки)
-
Составить диаграммы классов своей программы
-
Составление блок-схемы и написание программы, состоящей из двух исходных файлов.
-
Составить диаграмму объектов собственной программы
-
Освоить редактирование текстов в среде оболочки для много модульных программ, используя броузер классов для поиска необходимых модулей.
-
Создать и грамотно настроить проектный файл для программы ЛР, во втором файле должна быть выделена функция для вывода справки о программ (на COUT) с номером варианта, группой и ФИО студента.
-
Отладить программу с помощью отладчика с просмотром объектов классов
-
Сформировать листинг программы и листинг результатов
-
Оформить отчет по ЛР.
-
Перечень ошибок
Неверное объявление переменных, отсутствие подключаемой библиотеки в каталоге Include, неверное указание метода new, неверное объявление прототипа внешней функции.
-
Диаграмма классов.
Object – абстрактный базовый класс для всех объектов
Функции:
isA – возвращает ID класса
isEqual – определяет равен ли объект другому
printOn – отображает объект
Abstr, Deriv1, Deriv2, Deriv3 - четыре собственных класса (Absrt, Deriv1 ,Deriv2 и Deriv3 названия классов нельзя изменять), связанные следующим образом: Absrt - абстрактный класс, наследованный от Object ( из classlib); Deriv1 - наследуется от Absrt, Deriv2 наследуется от Deriv1, Deriv3 наследуется от Deriv1.
Container – абстрактный класс родитель всех классов, включает все классы способные содержать 0 или более элементов
Collection – абстрактный класс “коллекционных” структур
List – класс списка
Функции:
add – добавляет элемент
detach – удаляет объект
initIterator- создаёт итератор
flush – удаление всех объектов из списка
ListIterator – итератор списка
Функции
current – возвращает ссылку на текущий объект
++ - увеличивает значение итератора на 1
restart – перемещает итератор в первую непустую точку списка
-
Диаграмма объектов
-
Листинг программы
-
Файл main.cpp:
#include <iostream.h>
#include <conio.h>
#include <list.h>
#include "classes.h"
extern void About();
const Size=5;
void main()
{
int i;
Deriv1 d1;
Deriv2 d2;
Deriv3 d3;
cout<<"[Вывод значений при помощи методов объектов]"<<endl;
d1.print();
d2.print();
d3.print();
cout<<endl<<"[Вывод значений при помощи вызова методов через укаазатели]"<<endl;
Deriv1 *pd1= &d1;
Deriv2 *pd2= &d2;
Deriv3 *pd3= &d3;
pd1->print();
pd2->print();
pd3->print();
cout<<endl<<"[Вывод значений при помощи указателя на абстрактный класс]"<<endl;
Absrt *pa1;
pa1=&d1;
pa1->print();
pa1=&d2;
pa1->print();
pa1=&d3;
pd3->print();
cout<<endl<<"Press any key to continue..."; getch();
cout<<endl<<endl<<"[Создание списка]"<<endl<<endl;
List ListDerive;
for(i=0;i<Size;i++)
ListDerive.add(*new Deriv1(i));
for(i=0;i<Size;i++)
ListDerive.add(*new Deriv2(i));
for(i=0;i<Size;i++)
ListDerive.add(*new Deriv3(i));
cout<<"[Вывод значений элементов списка с помощью метода printOn]"<<endl;
ListIterator iA(ListDerive);
while(iA)
{
iA.current().printOn(cout<<endl);
iA++;
}
cout<<endl<<endl<<"Press any key to continue..."; getch();
cout<<endl<<endl<<"[Вывод значений элементов списка с помощью метода print]"<<endl<<endl;
iA.restart();
while(iA)
{
((Absrt*) &iA.current())->print();
iA++;
}
cout<<endl<<"Press any key to continue..."; getch();
iA.restart();
while(iA)
{
if(strcmp(iA.current().nameOf(),"Deriv2")!=0)
{
Absrt &M1=Absrt((Absrt&)iA++);
ListDerive.detach(M1,TShouldDelete::Delete);
}
else
iA++;
}
cout<<endl<<endl<<"[Вывод значений элементов списка после удаления объектов Deriv1 и Deriv3]"<<endl;
ListDerive.printOn(cout);
About();
}
-
Файл add.cpp:
#include <iostream.h>
void About(void)
{
cout<<endl<<"Выполнил студент группы ИУ5-62"<<endl<<"Суслов А.Ю.";
}
-
Файл classes.h:
#include <iostream.h>
#include <conio.h>
#include <strng.h>
#include <list.h>
#include <shddel.h>
class Absrt : public Object
{
public:
char Data[20];
Absrt() {Data[0]=0;}
virtual void print(){};
virtual void printOn(ostream& o) const {};
hashValueType hashValue() const {};
classType isA() const {};
int isEqual(const Object& testObject) const {};
int isSortable() const {};
char *nameOf() const {};
};
class Deriv1 : public Absrt
{
public:
Deriv1() {strcpy(Data,"drv1");}
Deriv1(int i)
{
char buf[10];
strcpy(Data,nameOf());
strcat(Data,itoa(i,buf,10));
}
virtual void print() {cout<<"Deriv1: Data="<<Data<<endl;}
virtual void printOn(ostream& o) const {o<<Data;}
char *nameOf() const {return "Deriv1";}
};
class Deriv2 : public Deriv1
{
public:
Deriv2() {strcpy(Data,"drv2");}
Deriv2(int i)
{
char buf[10];
strcpy(Data,nameOf());
strcat(Data,itoa(i,buf,10));
}
virtual void print() {cout<<"Deriv2: Data="<<Data<<endl;}
char *nameOf() const {return "Deriv2";}
};
class Deriv3 : public Deriv1
{
public:
Deriv3() {strcpy(Data,"drv3");}
Deriv3(int i)
{
char buf[10];
strcpy(Data,nameOf());
strcat(Data,itoa(i,buf,10));
}
virtual void print() {cout<<"Deriv3: Data="<<Data<<endl;}
char *nameOf() const {return "Deriv3";}
};
-
Листинг результатов работы
7