Клиенты для серверов, определение методов помещения в стек и извлечения из стека

Страницы работы

Содержание работы

Хабаровский Государственный Технический Университет

                                                                Кафедра ПОВТ и АС

Лабораторная работа по ООП №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

Похожие материалы

Информация о работе