Шаблонные классы


Шаблон класса обеспечивает скелет обобщенного класса для его последующей реализации с помощью типов данных, определенных пользователем. Как и шаблоны функций шаблоны классов обычно объявляются в заголовочных файлах.

// Программа 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);

Наиболее широкое применение шаблоны классов находят при создании контейнерных классов. Контейнерными классами называются классы, в которых хранятся организованные данные. Например, массивы, связные списки.

Основные типы контейнеров:

— ограниченный ("защищенный") массив

— очередь

— стек

— связный список

— бинарное дерево

Каждый из контейнеров выполняет конкретные операции сохранения и извлечения над заданной информацией и полученными запросами.

Загрузка...