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