Хабаровский Государственный Технический Университет
Кафедра ПОВТ и АС
Лабораторная работа по ООП №2
Выполнил: ст-т группы ПО-12 Черенков В.Л.
Проверил: Потапов И.И.
Хабаровск 2004
Задание: Реализовать два типа контейнера для хранения данных: первый тип должен быть построен на шаблонах классов, а второй – на указателях типа void. Для контейнера первого типа всё описание и реализацию записать в отдельном header-файле, а для второго типа – организовать реализацию в dll . Написать клиенты для первого и второго серверов.
Конкретизация задания: Для реализации выбираем класс стек на базе двунаправленного списка. Определены методы помещения в стек и извлечения из стека.
Листинг программы:
MyTemplate.h (сервер для шаблона классов)
template <class Data>
class StackHeader
{
class Stack
{
public:
Data d;
Stack *next,*prev;
//constructor
Stack(Data dat=0) {d=dat;next=0;prev=0;}
};
public:
int kol;
Stack *first,*last;
//constructor for Header
StackHeader() {first=0;last=0;kol=0;}
~StackHeader();
void push(Data d);
Data pop();
};
typedef StackHeader <int> IntStack;
typedef StackHeader <float> FloatStack;
//end of declaration class StackHeader
//realization of declarated methods
//destructor for All Stack
template <class Data>
StackHeader <Data>::~StackHeader()
{
if (first)
{
Stack *ptr=first;
while (ptr) {ptr=ptr->next;delete first;first=ptr;}
}
}
//adding to Stack
template <class Data>
void StackHeader <Data>::push(Data d)
{
Stack *ptr=new Stack(d);
if (first==NULL) first=last=ptr;
else {ptr->prev=last;last->next=ptr;last=ptr;}
kol++;
}
//pop Stack
template <class Data>
Data StackHeader <Data>::pop()
{
if (first) //если в стеке что-то есть
if (first==last) //если в нем 1 элемент
{Data dat=last->d;delete last;first=last=0;kol=0;return dat;}
else
{Data dat=last->d;last=last->prev;delete last->next;
last->next=0;kol--;return dat;}
else return 0;
}
UnitLab21.h (клиент для шаблона классов)
//--------------------------------------------------------------------------#include <vcl.h>
#include "Math.h"
#include "UnitLab21.h"
#include "MyTemplate.h"
#pragma resource "*.dfm"
TForm1 *Form1;
IntStack *Stack1=new IntStack;
FloatStack *Stack2=new FloatStack;
//--------------------------------------------------------------------------__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{randomize();}
//--------------------------------------------------------------------------void __fastcall TForm1::Button3Click(TObject *Sender)
{Close();}
//--------------------------------------------------------------------------void __fastcall TForm1::Button1Click(TObject *Sender)
{
if (RadioButton1->Checked)
{
Stack1->push(random(1000));
Memo1->Lines->Add(Stack1->last->d);
Label1->Caption=Stack1->kol;
}
if (RadioButton2->Checked)
{
Stack2->push(random(100)/2.7);
Memo2->Lines->Add(Stack2->last->d);
Label2->Caption=Stack2->kol;
}
}
//--------------------------------------------------------------------------void __fastcall TForm1::Button2Click(TObject *Sender)
{
if (RadioButton1->Checked)
{
Stack1->pop();
if (Memo1->Lines->Count)Memo1->Lines->Delete(Memo1->Lines->Count-1);
Label1->Caption=Stack1->kol;
}
if (RadioButton2->Checked)
{
Stack2->pop();
if (Memo2->Lines->Count)Memo2->Lines->Delete(Memo2->Lines->Count-1);
Label2->Caption=Stack2->kol;
}
}
//--------------------------------------------------------------------------void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{delete Stack1,Stack2;}
//--------------------------------------------------------------------------L2DLL.h (сервер - header-файл для контейнеров на void указателях)
//--------------------------------------------------------------------------#ifndef UnitDLLH
#define UnitDLLH
struct StackUnit
{
void *PClass;
StackUnit *prev,*next;
};
class __declspec(dllexport) Stack
{
public:
//конструкторы и деструкторы
Stack();
~Stack();
//методы
virtual void* Pop();
virtual void Push(void *PElem);
virtual int* GetKol();
private:
StackUnit *first, *last;
int kol;
};
extern "C" __declspec(dllexport) Stack* __stdcall MakeStack();
extern "C" __declspec(dllexport) void __stdcall DestroyStack(Stack *TheStack);
//--------------------------------------------------------------------------#endif
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.