Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OOP.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
40 Кб
Скачать
☆

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

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

Объявление шаблона класса:

template Список_параметров шаблона class Имя класса {. . .};

Процесс генерации объявления класса по шаблону класса и фактическим аргументам шаблона называется инстанцированием шаблона. Обычно он совмещается с объявлением объекта соответствующего конкретного типа. Синтаксис такого объявления:

Имя класса Список_параметров шаблона Идентификатор объекта;

Функции-члены класса-шаблона автоматически становятся функциями-шаблонами. Для них не обязательно явно задавать ключевое слово template.

Дружественная функция, которая использует параметры шаблона, сама является шаблоном. Конкретная реализация такой функции с учётом специфицированных параметров (порожденная функция) является дружественной для такого инстанцирования класса, которое совпадает по типам с фактическими типами аргументов порожденной функции.

Пример:

template <class T> class Y{ . . .};

template <class T> class X

{

// . . .

public:

friend void f1();

// функция f1() является

// дружественной ко всем

// инстанцированиям

// класса

friend Y f2(Y par1);

// порождение функции f2()

// для фактического типа T

// является дружественной

// только к тому

// инстанцированию класса

// X, которое подходит по

// фактическому

// типу–параметру.

// . . .

};

template Y f2(Y par1)

{ /* . . . */ }

Статические члены создаются для каждого инстанцирования класса.

Пример:

template class X {

static T x1;

// . . .

};

int X :: x1 = 0;

double X :: x1 = 1.5;

int main() {

X <int>xx1;

X <double>xx2;

. . .

return 0; }

61)/* Создается класс Student. Формируется динамический массив объектов. При

тестировании выводится: сформированный список студентов, список студентов

заданного факультета, список студентов для заданных факультета и курса.*/

#include <conio.h>

#include <string.h>

#include <iostream.h>

struct date // дата рождения

{char daymon[6];

int year; };

//======= class Student =================

class Student{

char name[30]; //private

date t;

char adr[30], fac[20];

int kurs;

public:

Student();

char *getfac();

int getkurs();

void show();

};

Student::Student()

{cout<<"Input name:"; cin>>name;

cout<<"Input date of born\n";

cout<<"Day.mon:"; cin>>t.daymon;

cout<<"Year:"; cin>>t.year;

cout<<"Input adr:"; cin>>adr;

cout<<"Input fac:"; cin>>fac;

cout<<"Input kurs:"; cin>>kurs;

}

void Student::show()

{

cout<<"Name :"<<name<<endl;

cout<<"Was born :"<<t.daymon<<'.'<<t.year<<endl;

cout<<"Address :"<<adr<<endl;

cout<<"Fac :"<<fac<<endl;

cout<<"Kurs :"<<kurs<<endl;

}

char *Student::getfac() { return fac; }

int Student::getkurs() { return kurs; }

void spisfac(Student spis[],int n)//список студентов заданного факультетата

{char fac[20];

cout<<"Input faculty:"; cin>>fac;

for(int i=0;i<n;i++)

if(strcmp(spis[i].getfac(),fac)==0)spis[i].show();

}

void spisfackurs(Student spis[],int n)

//список студентов заданных факультета и курса

{int i,k;

char fac[20];

cout<<"Input faculty:"; cin>>fac;

cout<<"Input the course:"; cin>>k;

for(i=0;i<n;i++)

if ((strcmp(spis[i].getfac(),fac)==0)&&(spis[i].getkurs()==k))

spis[i].show();

}

//========= main ================

void main()

{ Student *spis;

int n;

cout<<"Input a number of students: "; cin>>n;

spis=new Student [n];

for(int i=0;i<n;i++) {

cout<<"=============================="<<endl;

spis[i].show();

}

spisfac(spis,n);

spisfackurs(spis,n);

delete [] spis;

cout<<"press any key!"

while(!kbhit());

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]