Ззадание
Разработать шаблон контейнерного класса для хранения и обработки разнотипных данных.
Выбор алгоритма решения задачи
Для решения этой задачи необходимо будет объявить шаблон контейнерного класса, т.е. контейнерный класс для разнотипных данных, которые выполняют одно и тоже действие, например, положить в стек, взять с стека.
Описание решения задачи
Для откровение шаблона контейнерного класса, необходимо написать так:
template< class T >
class Cint,
после чего писать производные шаблоны этого контейнерного класса, например, положить в стек:
template< class T >
void Cint<T>::Show (T *begin) )
Текст программы
1. Base.h
#ifndef base_h
#define base_h
#include<string.h>
#include<iostream.h>
class Base {
public:
Base (){};
virtual ~Base(){};
virtual void show() = 0;
};
#endif
2. Cint.h
#ifndef Cint_h
#define Cint_h
#include<string.h>
#include<conio.h>
#include<iostream.h>
#include "Base.h"
//////////////////////////////////////////////////
template< class T >
class Cint: public Base {
public:
Cint(){tPtr = new T;};
~Cint(){tPtr = NULL;};
void show() {cout << "S kakimi dannimy vi hotyte rabotat???"
<<"\ntext - 1\n"<<"integer - 2\n"<<"drobniye - 3\n"<<"Exit - 4"<<endl;};
void Text();
T *Add(T *, T *);
void Show(T *);
void FreeRam(T *);
T *gettPtr(){return tPtr;};
//////////////////////////////////////////////////
private:
T *tPtr;
};
///////////////////////////////////////////////////
///////////////////////////////////////////////////
template < class T>
T *Add(T *posl, T *begin);
template < class T>
void Show(T *begin);
template < class T>
void FreeRam(T *begin);
//////////////////////////////////////////////////////
template< class T >
void Cint<T>::Text(){
int ch;
T *Posl = NULL;
do{
cout<<" <1> - DOBAVIT ZAPIS \n"
<<" <2> - PROSMOTR SPISKA \n"
<<" <3> - EXIT \n";
cin>>ch;
switch (ch){
case(1):
Posl = Add(Posl, gettPtr());
break;
case(2):
Show(gettPtr());
break;
}
}while (ch != 3);
FreeRam(gettPtr());
getch();
}
////////////////////////////////////////////////////////
template < class T>
T *Cint<T>::Add(T *posl, T *begin)
{
if (posl == NULL){
posl = begin;
}
else { posl->Next = new T;
posl = posl->Next;
}
cout << "Vvedite: \n";
cin >> posl->n;
posl->Next = NULL;
return posl;
}
//////////////////////////////////////////////////////////
template < class T>
void Cint<T>::Show(T *begin)
{
cout << "<Prosmotr spiska!!!> \n";
while (begin != NULL) {
cout <<"\n"<< begin->n;
begin = begin->Next;
}
cout<<"\n"<<endl;
getch();
}
////////////////////////////////////////////////////////////
template < class T>
void Cint<T>::FreeRam(T *begin)
{
T *prom;
cout << "ochistka!!! \n"<<endl;
prom = begin;
while ( prom != NULL) {
begin = begin->Next;
delete prom;
prom = begin;
}
}
#endif
3. Main.cpp
#include <string.h>
#include <iostream.h>
#include "Cint.h"
struct text{
char n[50];
text *Next;
};
struct summa{
int n;
summa *Next;
};
struct drob{
float n;
drob *Next;
};
/////////////////////////////////////////////////////////
int main() {
Cint<text> F;
Cint<summa> G;
Cint<drob> H;
int i;
F.show();
cout<<"Vvedite cifry: "<<endl;
cin >> i;
switch (i) {
case 1 :
F.Text();
break;
case 2 :
G.Text();
break;
case 3 :
H.Text();
break;
}
return 0;
}
Результат работы программы