69736

Використання шаблонів класів

Домашняя работа

Информатика, кибернетика и программирование

Щоб створити за допомогою шаблона конкретний об’єкт конкретного класу (цей процес називається інстанціонуванням), при описі об’єкту після імені шаблона в кутових дужках перераховуються його аргументи...

Украинкский

2014-10-09

32.5 KB

0 чел.

Самостійне вивчення

Тема 13: Використання шаблонів класів

Щоб створити за допомогою шаблона конкретний об'єкт конкретного класу (цей процес називається інстанціонуванням), при описі об'єкту після імені шаблона в кутових дужках перераховуються його аргументи:

ім'я_шаблона <аргументи> імя_об'єкта [(параметри_конструктора)];

Аргументи повинні відповідати параметрам шаблона. Ім'я шаблона разом з аргументами можна сприймати як уточнене ім'я класу. Приклади створення об'єктів за шаблонами:

List <int> List_int;

List <double> List_double;

List <monstr> List_monstr;

Block <char, 128> buf;

Block <monstr, 100> stado;

При використанні параметрів шаблона за замовчуванням список аргументів може виявитися порожнім, при цьому кутові дужки опускати не можна:

template<class T = char> class String;

String<>* p;

Якщо параметром шаблона є шаблон, який має спеціалізацію, вона враховується при інстанціонуванні:

template<class T> class A {                // Початковий шаблон

int x;

};

template<class T>  class A <T*> {  // Спеціалізація шаблона

long x;

};

template <template<class U> class V> class C{

V<int> у;

V<int*> z;

};

C<A> с;

В даному прикладі V<int> всередині С<А>  використовує початковий шаблон, тому с.у.х має тип int, а V<int*> використовує спеціалізацію шаблона, тому c.z.x маєтип long.

На місці формальних параметрів, які є змінними цілого типу повинні стояти константні вирази.

Після створення об'єктів за допомогою шаблона з ними можна працювати так само, як з об'єктами звичайних класів, наприклад:

for (int і = 1; i<10; i++) List_double.add(i * 0.08);

List_double.print();

//..................................

for (int і = 1; i<10; i++) List_monstr.add(i);

Listmonstr.print();

//---------------------------------------

strcpy(buf, "Дуже важливе повідомлення");

cout << buf << endl;

Для спрощення використання шаблонів класів можна застосувати перейменування типів за допомогою

typedef:

typedef List <double> Ldbl;

Ldbl List_double;

Спеціалізація шаблонів класів

Кожна версія класу або функції, яка створюється за шаблоном, містить однаковий базовий код; змінюється тільки те, що пов'язано з параметрами шаблона. При цьому ефективність роботи версій, які створюються для різних типів даних, може сильно розрізнятися.

Якщо для якого-небудь типу даних існує більш ефективний код, можна або передбачити для цього типу спеціальну реалізацію окремих методів, або повністю перевизначити (спеціалізувати) шаблон класу. Для спеціалізації методу вимагається визначити варіант його коду, вказавши в заголовку конкретний тип даних. Наприклад, якщо заголовок узагальненого методу print шаблона List має вид

template <class Data>  void List <Data>::print():

спеціалізований метод для виведення списку символів виглядатиме наступним чином:

void

List <char>::print()

{

... // Тіло спеціалізованого варіанту методу print

}

Якщо в програмі створити екземпляр шаблона List типу char, відповідний варіант методу буде викликаний автоматично. При спеціалізації цілого класу після опису узагальненого варіанту класу поміщається повний опис спеціалізованого класу, при цьому вимагається наново визначити всі його методи. Припустимо, вимагається спеціалізувати шаблон Block для зберігання 100 цілих величин:

class Block<int, 100>

{

public:

Block()

{

p = new int [100];

}

~Block()

{

delete [] p;

}

operator int *();

protected:

int * p;

};

Block<int. 100>::operator int *()

{

return p;

}

При визначенні екземплярів шаблона Block з параметрами int і 100 буде задіяний спеціалізований варіант.

Переваги і недоліки шаблонів

Шаблони є могутнім і ефективним засобом поводження з різними типами даних, яке можна назвати параметричним поліморфізмом, а також забезпечують безпечне використання типів, на відміну від макросів препроцесора. Проте слід мати на увазі, що програма, яка використовує шаблони, містить повний код для кожного породженого типу, що може збільшити розмір виконуваного файлу. Крім того, з деякими типами даних шаблони можуть працювати не так ефективно, як з іншими. В цьому випадку має сенс використовувати спеціалізацію шаблона. Стандартна бібліотека C++ надає великий набір шаблонів для різних способів організації зберігання і обробки даних.


 

А также другие работы, которые могут Вас заинтересовать

32741. Момент инерции тела относительно оси. Момент инерции кольца, диска 31 KB
  Момент инерции тела относительно оси. Момент инерции кольца диска. Момент инерции тела относительно оси определяется согласно формулеи если известно pаспpеделение масс частей тела относительно оси он может быть найден прямым вычислением. Конечно с помощью компьютера интеграл можно вычислить но аналитически моменты инерции обычно вычисляют лишь для простейших случаев однородных тел.
32742. Момент инерции шара. Теорема Штейнера 39.5 KB
  Момент инерции шара. Момент инерции полого шара с бесконечно тонкими стенками. Сначала найдем момент инерции относительно центра шара. В результате находим момент инерции полого шара относительно его диаметра: .
32743. Момент импульса. Уравнение моментов. Закон сохранения момента импульса 34 KB
  Момент импульса. Закон сохранения момента импульса. Моментом импульса т. Момент импульса характеризует количество вращательного движения.
32744. Гироскоп. Свободные оси. Главные оси момента инерции. Регулярная прецессия 50 KB
  Схема простейшего механического гироскопа в карданном подвесе Основные типы гироскопов по количеству степеней свободы: 2степенные 3степенные. Прецессия гироскопа. Прецессией называется движение по окружности конца оси гироскопа под действием постоянно действующей малой силы. Скорость прецессии гироскопа определяется величиной внешней силы F точкой ее приложения значением и направлением угловой скорости вращения диска гироскопа w и его моментом инерции I.
32745. Работа силы при вращении твердого тела. Кинетическая энергия вращающегося тела 34.06 KB
  Работа силы при вращении твердого тела. Кинетическая энергия вращающегося тела. Работа и мощность при вращении твердого тела. Найдем выражение для работы при вращении тела.
32746. Неинерциальные системы отсчёта. Силы инерции. Принцип эквивалентности. Уравнение движения в неинерциальных системах отсчёта 36 KB
  Силы инерции. При рассмотрении уравнений движения тела в неинерциальной системе отсчета необходимо учитывать дополнительные силы инерции. Это уравнение может быть записано в привычной форме Второго закона Ньютона если ввести фиктивные силы инерции: переносная сила инерции сила Кориолиса Сила инерции фиктивная сила которую можно ввести в неинерциальной системе отсчёта так чтобы законы механики в ней совпадали с законами инерциальных систем. В математических вычислениях введения этой силы происходит путём преобразования уравнения...
32747. Принцип относительности Галилея. Преобразования Галилея. Классическая теорема сложения скоростей. Инвариантность законов Ньютона в инерциальных системах отсчёта 39.5 KB
  Математически принцип относительности Галилея выражает инвариантность неизменность уравнений механики относительно преобразований координат движущихся точек и времени при переходе от одной инерциальной системы к другой преобразований Галилея.Пусть имеются две инерциальные системы отсчёта одну из которых S условимся считать покоящейся; вторая система S' движется по отношению к S с постоянной скоростью u так как показано на рисунке. величинами не изменяющимися при переходе от одной системы отсчёта к другой. В кинематике все системы...
32748. Постулаты Эйнштейна для СТО. Преобразования Лоренца 29.5 KB
  Преобразования Лоренца. Преобразования Лоренца возникли на рубеже XIXXX веков как формальный математический прием для согласования электродинамики с механикой и легли в основу специальной теории относительности. Согласно этим преобразованиям длины и промежутки времени искажаются при переходе из одной системы отсчета в другую. Преобразования Лоренца сложнее чем преобразования Галилея: В этих формулах x и t положение и время в условно неподвижной системе отсчета x′ и t′ положение и время в системе отсчета движущейся относительно...
32749. Относительность понятия одновременности. Относительность длин и промежутков времени. Интервал между событиями. Его инвариантность. Причинность 50.5 KB
  Следовательно события одновременные в одной инерциальной системе отсчета не являются одновременными в другой системе отсчета т. Относительность промежутков времени Пусть инерциальная система отсчета K покоится а система отсчета K0 движется относительно системы K со скоростью v. Тогда интервал времени между этими же событиями в системе K будет выражаться формулой: Это эффект замедления времени в движущихся системах отсчета. Относительность расстояний Расстояние не является абсолютной величиной а зависит от скорости движения тела...