Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






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






 

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

template < class nmun > class имя_класса {

}

Здесь nmun является параметром-типом, который будет указан при создании объекта класса. При необходимости можно определить несколько типов, разделяя их запятыми.

После создания класса-шаблона можно создать конкретный объект этого класса, используя следующую общую форму:

имя_класса < тип> объект;

Тип – имя типа данных, с которым будет оперировать этот класс.

Функции-элементы класса-шаблона являются сами по себе автоматически шаблонами. Нет необходимости особым образом указывать на то, что они являются шаблонами с использованием ключевого слова template.

В следующей программе создается класс-шаблон массив, будет содержать три метода: ввод массива, вывод и сортировку его методом пузырька.

#define SIZE 10//максимальный размер массива

template < class typeArray> class tArray{

typeArray B[SIZE]; //непосредственно массив

int n; //реальный размер массива

public: tArray(int l){n=l}; //конструктор, инициализирует реальный размер

void input(); //ввод массива

void output(); //ввод массива

void bubble(); // сортировка методом пузырька

};

template < class tArray > void tArray < tArray >:: input(){//ввод

for (int i=0; i< n; i++){cin> > B[i]; }

}

template < class tArray > void tArray < tArray >:: output(){//вывод

for (int i=0; i< n; i++){cout< < B[i]; }

}

template < class tArray > void tArray < tArray >:: bubble(){

char is=1; int i; tArray c;

while(is){is=0;

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

if (B[i] < B[i-1]){ c=B[i]; B[i]=B[i-1]; B[i-1]=c; is=1; }

}

}

void main(){

tArray < int> C(3); // создаем массив типа int из трех элементов

C.input(); //ввод массива

C.bubble(); //сортировка методом пузырька

C.output(); //вывод отсортированного массива

}

Данный класс–шаблон можем использовать и для работы с массивом простых дробей, для обработки которых используется описанный выше класс fraction. Только класс drop необходимо немного модифицировать: переопределить операции ввода и вывода, а также оператор <, чтобы была возможность применить операцию сортировки методом пузырька.

class fraction{

int m; //числитель

int n; //знаменатель

public: int operator< (fraction ob2); //переопределяем оператор <

//переопределяем операторы ввода/вывода

friend istream & operator> > (istream & stream, fraction & ob);

friend ostream & operator< < (ostream & stream, fraction ob);

};

int fraction:: operator < (fraction ob2){

if(m*ob2.n< n*ob2.m) return true;

else return false;

}

Рассмотрим подробнее функцию, переопределяющую оператор <. Это логический оператор, поэтом функция должна возвращать либо true, либо false. Поэтому тип данных выбран int. В качестве параметра функция принимает параметр типа fraction с названием ob2, т.е. это дробь, которая будет стоять справа от знака<. Переменные m и n – это внутренние переменные дроби, которая стоит слева от знака <. Т.е. сравниваются две дроби m/n и ob2.m/ob2.n. Для сравнения дробей мы должны привести их к общему знаменателю и сравнить числители. Если дробь слева от оператора меньше дроби справа, то возвращаем истину иначе возвращаем ложь.

istream & operator> > (istream & stream, fraction & ob){

cout< < " Числитель"; stream > > ob.m;

cout< < " Знаменатель"; stream > > ob.n;

return stream;

}

ostream & operator< < (ostream & stream, fraction ob){

stream < < ob.m< < " /" < < ob.n;

return stream;

};

void main(){

tArray < fraction> C(3); //создаем массив типа fraction из 3-х элементов

C.input(); //ввод массива

C.bubble(); //сортировка методом пузырька

C.output(); //вывод отсортированного массива

}

Как видим, программный код в главной функции отличается от кода из примера с массивом целых чисел только в первой строке при указании типа массива. Более того, данный класс-шаблон подойдет и для решения более сложных практических задач. Например, необходимо отсортировать массив, содержащий результаты выступления спортсменов в порядке возрастания набранных баллов. Для решения необходимо всего лишь создать класс sportsmen, описывающий обработку данных о конкретном спортсмене, в котором переопределить операции ввода, вывода и операцию больше. В этом случае для класса подойдут все методы, описанные в классе шаблоне tArray.

class sportsmen{

int id; // идентификатор

char surname[10]; //фамилия

int result; //результат

public: int operator< (sportsmen ob2); //переопределяем оператор <

//переопределяем оператор ввода и вывода

friend ostream & operator< < (ostream & stream, sportsmen ob);

friend istream & operator> > (istream & stream, sportsmen & ob);

};

int sportsmen:: operator < (sportsmen ob2){

if(result< ob2.result) return true;

else return false;

}

ostream & operator< < (ostream & stream, sportsmen ob){

cout< < ob.id< < " /" < < ob.surname< < " /" < < ob.result< < endl;

return stream;

};

istream & operator> > (istream & stream, sportsmen & ob){

cout< < endl< < " Input id"; cin> > ob.id;

cout< < " Input Surname"; cin> > ob.surname;

cout< < " Input result"; cin> > ob.result;

return stream;

}

void main(){

tArray < sportsmen> C(3); //создаем массив типа sportsmen

C.input(); //ввод массива

C.bubble(); //сортировка методом пузырька

C.output(); //вывод отсортированного массива

}

Как видим программный код внутри функции main() отличается от предыдущих примеров только типом используемого массива. Но программа выполняет действия по обработке информации и спортсменах.

 






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.