Шаблон класса обеспечивает скелет обобщенного класса для его последующей реализации с помощью типов данных, определенных пользователем. Как и шаблоны функций шаблоны классов обычно объявляются в заголовочных файлах.
// Программа 2
#ifndef _DB
#define _DB
template<class T>
class TDatabase {
private:
T *rp; //указатель на записи
int num; //число записей
public:
TDatabase(int n)
{ pr = new T[ num = n];}
~TDatabase() {delete[] rp }
void DoNothing(void);
T &GetRecord(int recnum);
};
template<class T>
void TDatabase<T>::DoNothing(void) { }
template<class T>
T &TDatabase<T>::GetRecord(int recnum)
{
T *crp = rp;
if (0 <= recnum && recnum < num)
while (recnum — >0)
crp++;
return *crp;
}
#endif
#include <iostream.h>
#include <string.h>
#include «db.h»
class TRecord {
private:
char name[41];
public:
TRecord() { name[0] = 0; }
TRecord(const char *s) { Assign(s); }
void Assign(const char *s) { strcpy(name, s); }
char *GetName(void) { return name; }
};
void main()
{
int rn; //индекс числа записей
TDatabase<TRecord> db(3); //база данных из трех записей
TDatabase<TRecord*> dbp(3); //база данных из трех указателей
TDatabase<TRecord> *pdb; //указатель на БД
TDatabase<TRecord*> *ppdb; //указатель на БД указателей
cout << endl << «Database of 3 TRecord» << endl;
db.GetRecord(0).Assign(«George Washington»);
db.GetRecord(1).Assign(«John Adams»);
db.GetRecord(2).Assign(«Thomas Jefferson»);
for ( rn = 0; rn < 3; rn++ )
cout << db.GetRecord(rn).GetName() << endl;
cout << endl << «Database of 3 TRecord pointers» << endl;
dbp.GetRecord(0) = new TRecord(«George Washington»);
dbp.GetRecord(1) = new TRecord(«John Adams»);
dbp.GetRecord(2) = new TRecord(«Thomas Jefferson»);
for ( rn = 0; rn < 3; rn++ )
cout << dbp.GetRecord(rn)->GetName() << endl;
cout << endl << «Pointer to database of 3 TRecord » << endl;
pdb= new TDatabase<TRecord>(3);
pdb->GetRecord(0).Assign(«George Washington»);
pdb->GetRecord(1).Assign(«John Adams»);
pdb->GetRecord(2).Assign(«Thomas Jefferson»);
for ( rn = 0; rn < 3; rn++ )
cout << pdb->GetRecord(rn).GetName() << endl;
cout << endl << «Pointer to database of 3 TRecord pointers» << endl;
ppdb = new TDatabase<TRecord *>(3);
ppdb->GetRecord(0) = new TRecord(«George Washington»);
ppdb->GetRecord(1) = new TRecord(«John Adams»);
ppdb->GetRecord(2) = new TRecord(«Thomas Jefferson»);
for ( rn = 0; rn < 3; rn++ )
cout << ppdb->GetRecord(rn)->GetName() << endl;
}
Можно создать базу данных из других типов значений, для этого не обязательно использовать такие типы классов как TRecord.
Например: TDatabase<double> dbd(100);
Наиболее широкое применение шаблоны классов находят при создании контейнерных классов. Контейнерными классами называются классы, в которых хранятся организованные данные. Например, массивы, связные списки.
Основные типы контейнеров:
— ограниченный («защищенный») массив
— очередь
— стек
— связный список
— бинарное дерево
Каждый из контейнеров выполняет конкретные операции сохранения и извлечения над заданной информацией и полученными запросами.
