Загрузка...
 
Печать
ИГРОКОДИНГ  »  ИГРОКОДИНГ: Учебный курс  »  Программируем 3D-шутер от первого лица (FPS) (Win32, Cpp, DirectX9)  »  Часть 1. Создание движка  »  Шаблоны (Templates) функций и классов

Шаблоны (Templates) функций и классов


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

Ты уже знаешь, что все переменные относятся к определённому типу, называемому тип данных. Например, у тебя есть переменная типа int, float или bool (всё это основные (или "примитивные") типы данных). Переменная также может иметь тип структуры, класса, указателя на класс или экземпляра структуры. Это даёт огромные возможности по их применению, но, в то же время, часто порождает всевозможные проблемы, связанные с конфликтом типов данных. Например, что будет в результате применения определённой операции к переменной А типа int, а затем применения такой же операции к переменной B типа bool? Вот здесь-то шаблоны нам и помогут. В двух словах, шаблоны (классов и функций) используются для осуществления одних и тх же операций с различными типами данных. Рассмотрим следующий сильно упрощённый пример.

Представь, что тебе необходимо написать функцию, которая производит сложение двух переменных типа int и возвращает результат. Ты быстро решишь эту задачу, написав функцию, которая принимает в качестве параметров две переменные типа int и затем возвращает их сумму. А что если вдруг понадобится произвести такую же операцию, но уже с переменными типа float, с сохранением результата с той же точностью (то есть без дробных значений)? Очевидно, что ты не станешь использовать для этого ту же самую функцию, что ты до этого написал для сложения переменных типа int. Написать для этого ещё одну функцию, конечно же, не проблема. Но проблема кроется в другом. Что если тебе понадобится произвести ту же операцию, но уже с переменными типа double? Как видишь, мы уже написали целых 3 новых функции, которые проделывают одну и ту же операцию. Их определение может выглядеть примерно так:

Функции для сложения переменных разных типов
int AddInts(int value1, int value2);
float AddFloats(float value1, float value2);
double AddDoubles(double value1, double value2);

Что, если бы была возможность сжать эти 3 функции в одну, совместимую с каждым из этих типов данных? Да, такая возможность есть. Для этого и были придуманы шаблоны(external link) (templates).
При использовании шаблонов объявление новой функции выглядело бы так:

Объявление функции-шаблона для сложения переменных разных типов
template <class Type> Type Add(Type value1, Type value2);

Эта шаблонная функция принимает значения любого типа и пытается их сложить, используя математический оператор "+", а затем возвращает значение такого же типа. Другими словами, ты можешь сложить переменные типа int, а затем переменные типа float, используя всего одну эту функцию. За определение типа данных отвечает оператор class Type, который позволяет программеру указывать, какой тип данных будет использоваться в данной функции. Затем функция просто принимает две переменные, указанного типа, и возвращает значение того же типа.
Реализация этой шаблонной функции выглядела бы так:

Реализации функции-шаблона для сложения переменных разных типов
int MyInt = Add<int>(5, 45);
float MyFloat = Add<float>(3.2, 17.47);
double MyDouble = Add<double>(29.4967, 12.01568);


Шаблонизировать можно не только функции. Ты даже можешь создавать целые классы, которые являются шаблонами для других классов. Взгляни на этот пример:

Пример шаблонного класса (template class)
template<class Type> class Maths
{
	public:
	Type Add(Type value1, Type value2);
	Type Multiply(Type value1, Type value2);
	Type Divide(Type value1, Type value2);
};

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

Пример создания экземпляра шаблонного класса (template class)
Maths<float>	*floatMaths = new Maths<float>;
float addTest = floatMaths->Add(2.45f, 15.9f);
float multiplyTest = floatMaths->Multiply(10.0f, 5.5f);
float divideTest = floatMaths->Divide(16.4f, 4.0f);

В первой строке этого исходного кода создаётся экземпляр класса Maths, работающий с типом данных float. Следующие три строки выполняют операции из нашего нового класса Maths (производят операции сложение, умножение и деление) над переменными типа float (тот же самый, что указан в конструкторе).

Закрыть
noteПримечание

Вообще, наиболее часто шаблоны применяются именно при создании классов. Проще всего представить шаблонный класс как некое клише. Другими словами, шаблонный класс не является объявлением класса, а служит в качестве клише (формы, болванки, трафарета и т.д.) для объявления класса. Таким образом, фактическое объявление класса происходит, когда создают экземпляр (инстанс) шаблонного класса, с указанием набора параметров. В нашем предыдущем примере мы создавали шаблонный класс с всего одним параметром. Их может быть и больше. Как в этом примере:

Пример шаблонного класса (template class) с несколькими параметрами
template <class Type, int size>	class MyData
{
	public:
	void SetData(type Data);
	Type GetData();

	private:
	char buffer[size];
};


О шаблонах можно рассказывать ещё долго. Однако, для их использования вполне достаточно базовых знаний, приведённых в этой статье. Просто помни об этой эффективной технологии и используй в своих проектах. На основе шабонов построено множество других программерских приёмов и технологий. Один из них - связный список(external link) (Linked list), без которого наверняка не обходится ни один игрокодерский проект.


ИГРОКОДИНГ  »  ИГРОКОДИНГ: Учебный курс  »  Программируем 3D-шутер от первого лица (FPS) (Win32, Cpp, DirectX9)  »  Часть 1. Создание движка  »  Шаблоны (Templates) функций и классов

Contributors to this page: slymentat .
Последнее изменение страницы Среда 30 / Март, 2016 09:38:44 MSK автор slymentat.

Последние комментарии

No records to display