Что такое findslide.org?

FindSlide.org - это сайт презентаций, докладов, шаблонов в формате PowerPoint.


Для правообладателей

Обратная связь

Email: Нажмите что бы посмотреть 

Яндекс.Метрика

Презентация на тему ООП 6. Обобщённое программирование. Шаблоны (параметризованные типы)

Содержание

Повод: необходимость реализовать некий новый объем кода, аналогичный уже написанному, но изменив типы данных.Варианты решения: Дублирование фрагментов кода (плохо!)Средствами языка СМакроопределения. Недостатки: целесообразно только для очень простых функций; отсутствует контроль типов; трудности при отладке;может сильно
Обобщённое программирование. Шаблоны  (параметризованные типы) Обобщённое программирование (generic programming) — парадигма программирования, Повод: необходимость реализовать некий новый объем кода, аналогичный уже написанному, но 1. #define SP(Type) \struct Shared_ptr { \   Type *p; \   …}; SP(LongString); 2) Обобщённое программирование с использованием нетипизированных указателей void* , например, библиотечные Средствами языка С++Переопределение функций. Делает текст программы более наглядным, но не Шаблоны функций Объявление шаблона функции начинается с заголовка, состоящего из ключевого слова template  T toPower (T base, int exponent){   T result Требования к фактическим параметрам шаблонаT result = base;return (T)1;return (T)0;result *= base;return Шаблоны функций с несколькими аргументами // Шаблон функции поиска // в массиве Отождествление типов аргументов template  T max (T a, T b) { Шаблоны классов // класс, хранящий // пару значенийtemplate  class Pair { Полное описание шаблона должно быть известно до его использования. Нельзя разбить объявление Параметризация числовыми параметрамиВозможность задания числовых параметров позволяет, например, создавать объекты типов Шаблонные методы template struct Array{	template	Array& operator=	   (Array const & m);};templatetemplateArray& Array::	operator = 		(Array const & m) { … }Array m;Array d;d = m;/*Просто запись Array внутри класса *Если шаблонная функция (или метод шаблонного класса) не вызывается, то она Специализация шаблона template struct Array { … }; templatestruct Array{… //отдельная реализация 	только для bool};Реализация класса точки в Частичная специализация  Массив указателей:templatestruct Array { … };// T- указатель на какой-либо типМассив массивов:templatestruct Array Различия между шаблоном класса и функциями   Для функций отсутствуют частичные Typedef Чтобы избежать громоздких записей имен типов видаArray m;	стоит использовать typedef:typedef Array AInt;Array m;typedef int* PI;typedef const PI CPI; //CPI Наследование в шаблонах классов template  class Trio: public Pair {   Базовый класс для шаблона может быть как шаблонным, так и обычным
Слайды презентации

Слайд 2
Повод: необходимость реализовать некий новый объем кода,

Повод: необходимость реализовать некий новый объем кода, аналогичный уже написанному,

аналогичный уже написанному, но изменив типы данных.
Варианты решения:
Дублирование

фрагментов кода (плохо!)
Средствами языка С
Макроопределения. Недостатки:
целесообразно только для очень простых функций;
отсутствует контроль типов;
трудности при отладке;
может сильно увеличить размер исполняемой программы

Слайд 3
1. #define SP(Type) \
struct Shared_ptr { \
 

1. #define SP(Type) \struct Shared_ptr { \   Type *p; \ 

 Type *p; \
   …
};

 SP(LongString); // не будет компилироваться для

разных типов,
//т.к. название структуры Shared_ptr будет одинаково для всех типов.

2. #define SP(Type, Name) \
struct Name { \
   Type *p; \
   …
};
 SP(LongString, spLongString); //Код пишется не на языке, а макросом. //Следовательно, компилятор не сможет проверить код.
//Могут возникнуть неожиданные подстановки
Данным решением стоит пользоваться во встраиваемых системах, которые поддерживают только С.


Слайд 4
2) Обобщённое программирование с использованием нетипизированных указателей

2) Обобщённое программирование с использованием нетипизированных указателей void* , например,

void* , например, библиотечные функции сортировки qsort(), двоичного поиска

bsearch(), копирования памяти memcpy().
void qsort(void *base, size_t num, size_t size, int (*compare) (const void *, const void *));
void * memcpy( void * destptr, const void * srcptr, size_t num );
Недостатки:
отсутствие информации о типах;
требует аккуратной работы с отдельными байтами;
преобразование любых указателей к void* существенно менее наглядно

Слайд 5
Средствами языка С++
Переопределение функций. Делает текст программы

Средствами языка С++Переопределение функций. Делает текст программы более наглядным, но

более наглядным, но не избавляет от необходимости повторять один

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



Слайд 6 Шаблоны функций
Объявление шаблона функции начинается с заголовка, состоящего

Шаблоны функций Объявление шаблона функции начинается с заголовка, состоящего из ключевого

из ключевого слова template, за которым следует список параметров

шаблона.


template X min (X a, X b)
{   return a
// X – имя типа
...
int m = min (1, 2);

Экземпляр шаблона функции породит код, сгенерированный компилятором
(инстанцирование):
int min (int a, int b)
{  return a


Слайд 7
template T toPower (T base, int

template T toPower (T base, int exponent){   T result

exponent){   T result = base;   if (exponent==0) return (T)1;  

if (exponent<0) return (T)0;   while (--exponent) result *= base;   return result; }
int i = toPower (10, 3);
int i = toPower (10, 3); // Т становится типом int
long l = toPower (1000L, 4); // Т становится типом long
double d = toPower (1e5, 5); //Т становится типом double
int i = toPower (1000L, 4); // ошибка компиляции:
// используются разные типы данных



Слайд 8 Требования к фактическим параметрам шаблона
T result = base;
return

Требования к фактическим параметрам шаблонаT result = base;return (T)1;return (T)0;result *=

(T)1;
return (T)0;
result *= base;
return result;

class T{  public:   T (const T

&base);
// конструктор копирования   T (int i); //приведение int к Т   operator *= (T base);   // ... прочие методы }

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


Слайд 9 Шаблоны функций с несколькими аргументами
// Шаблон функции

Шаблоны функций с несколькими аргументами // Шаблон функции поиска // в

поиска // в массиве
template
int find(atype*

array,
atype value, int size) {
for(int j = 0; j < size; j++)
if(array[j] == value)
return j;
return -1;
}

int intArr[] = { 1, 3, 5, 7 };
int in = 3;
float fl = 5.0;

int value = find(intArr, in,4);

int value = find(intArr, fl, 4); // ошибка! Аргументы
// шаблона должны быть // согласованы


Слайд 10 Отождествление типов аргументов
template T max (T a,

Отождествление типов аргументов template T max (T a, T b) {

T b) {  return a > b ? a : b; }



int i = max (1, 2);
double d = max (1.2, 3.4);
// Однако, если аргументы различных типов, то вызов max() приведет к ошибке.

1. Приведение типов
int i = max ((int)'a', 100);
2. Явное объявление версии экземпляра шаблона
int max (int, int);
int j = max ('a', 100);
3. template T1 max (T1 a, T2 b) {  return a > (T1)b ? a : (T1)b; }
max ('a', 100); //char max (char, int);
max (100, 'a‘); //int max (int, char);



Слайд 11 Шаблоны классов
// класс, хранящий
// пару значений
template

Шаблоны классов // класс, хранящий // пару значенийtemplate class Pair {

T> class Pair {    T a, b;  public:    Pair (T t1, T

t2);    T Max();    T Min ();    int isEqual (); };

template T Pair ::Min() {  return a < b ? a : b; }

// Если бы Pair был обычным классом , а не шаблоном:
T Pair::Min() {  return a < b ? a : b; }


Слайд 12 Полное описание шаблона должно быть известно до его

Полное описание шаблона должно быть известно до его использования. Нельзя разбить

использования. Нельзя разбить объявление и реализацию на .cpp и

.h файлы, реализация должна быть известна и находиться в заголовочном файле.

template
Pair ::Pair (T t1, T t2) : a(t1), b(t2) {}
template
T Pair ::Max() {return a>b ? a : b;}
template
int Pair ::isEqual(){ if (a==b) return 1; return 0;}

Чтобы создать экземпляр класса Pair для некоторого классового типа, например для класса X, этот класс должен содержать следующие общедоступные функции: X (X &);
// конструктор копирования
int operator == (X);
int operator < (X);


Слайд 13 Параметризация числовыми параметрами
Возможность задания числовых параметров позволяет, например,

Параметризация числовыми параметрамиВозможность задания числовых параметров позволяет, например, создавать объекты типов

создавать объекты типов "Вектор из 20 целых", "Вектор из

1000 целых" или "Вектор из 10 переменных типа double".
template class Vector {  public:    Vector();    ~Vector() {delete[] coord;}    void newCoord (T x);    T Max ();    T Min();    int isEqual();  private:    T *coord;   int current; };

//конструктор
template Vector ::Vector(): {   coord = new T[n];   current = 0; }
template T Vector ::Max(): {   T result (coord[0]);  for (int i=0; i


Слайд 14 Шаблонные методы
template 
struct Array{
template
Array& operator=
 (Array const & m);
};
template
template
Array& Array::
operator = 
(Array const & m) { … }

Array m;
Array d;
d = m;
/*Просто запись

Шаблонные методы template struct Array{	template	Array& operator=	  (Array const & m);};templatetemplateArray& Array::	operator = 		(Array const & m) { … }Array m;Array d;d = m;/*Просто запись Array внутри класса

Array внутри класса означает Array с уже подставленным параметром.

Вне класса это не действует*/
template 
void sort(Array& m) { … }
sort(d); /*в sort передан массив из double */




Слайд 15 *Если шаблонная функция (или метод шаблонного класса) не

*Если шаблонная функция (или метод шаблонного класса) не вызывается, то

вызывается, то она и не компилируется. *Виртуальная функция не может

быть шаблонной.

Шаблонный конструктор:
template
struct Array { 
 template
   Array(Array a) { … }
}; /* предполагается, что есть неявное приведение типа V к T*/
Это не конструктор копирования!

Конструктор копирования, конструктор по умолчанию не могут быть шаблонными:
template
Array() {...} // нельзя!

Array ??? a; //непонятно, куда вставить вторую пару <>.


Слайд 16 Специализация шаблона
template 
struct Array { … };
 
template
struct Array
{

 //отдельная реализация только для bool
};

Реализация

Специализация шаблона template struct Array { … }; templatestruct Array{… //отдельная реализация 	только для bool};Реализация класса точки

класса точки в различных измерениях (1D, 2D, 3D...):
template 
struct point;
 
template
struct point{
... //определение
};
Теперь

возможно создать точку только для 1 измерения


Слайд 17 Частичная специализация
Массив указателей:
template
struct Array { … };
// T- указатель на
какой-либо

Частичная специализация Массив указателей:templatestruct Array { … };// T- указатель на какой-либо типМассив массивов:templatestruct Array

тип

Массив массивов:
template
struct Array { … };
//T - массив Array



template
struct fact{
   static const int v = 
fact::v * n;
};
 template
struct fact{
 

 static const int v = 1;
}
fact<10>::v; //Значение факториала будет посчитано на этапе компиляции!! (Для каждой реализации шаблона статические данные специфичны )



Слайд 18 Различия между шаблоном класса и функциями
Для функций

Различия между шаблоном класса и функциями  Для функций отсутствуют частичные

отсутствуют частичные специализации. Но их можно заменить перегрузкой функций:
template
void sort(Array& m)
 {...};
 
template
void sort(T& t) {...};



Шаблон

класса может иметь параметры по умолчанию
template
struct V{ … };
/*в запись вида V<> по умолчанию будет подставлен string */

template
struct V{ … };
V
//вместо A и B будет int


Слайд 19 Typedef
Чтобы избежать громоздких записей имен типов вида
Array m;
стоит

Typedef Чтобы избежать громоздких записей имен типов видаArray m;	стоит использовать typedef:typedef Array AInt;Array m;typedef int* PI;typedef const PI CPI;

использовать typedef:
typedef Array AInt;
Array m;

typedef int* PI;
typedef const PI CPI; //CPI будет константным указателем, т.к.

известно, что PI - указатель. А при использовании #define в CPI было бы const int *, т.е. указатель на const int.


Слайд 20 Наследование в шаблонах классов
template class Trio: public

Наследование в шаблонах классов template class Trio: public Pair {  

Pair {   T c;  public:   Trio (T t1, T

t2, T t3);  ...
};
template Trio::Trio (T t1, T t2, T t3): Pair (t1, t2), c(t3) {} /* вызов родительского конструктора также сопровождается передачей типа Т в качестве параметра*/


  • Имя файла: oop-6-obobshchyonnoe-programmirovanie-shablony-parametrizovannye-tipy.pptx
  • Количество просмотров: 118
  • Количество скачиваний: 0