SlideShare a Scribd company logo
Программирование на языке C++
Лекция 6
Шаблоны классов
Александр Смаль
1/5
Проблема “одинаковых классов”
struct ArrayInt {
explicit ArrayInt(size_t size)
: data_(new int[size ])
, size_(size) {}
~ArrayInt () {delete [] data_ ;}
size_t size () const
{ return size_; }
int operator []( size_t i) const
{ return data_[i]; }
int & operator []( size_t i)
{ return data_[i]; }
...
private:
int * data_;
size_t size_;
};
struct ArrayFlt {
explicit ArrayFlt(size_t size)
: data_(new float[size ])
, size_(size) {}
~ArrayFlt () {delete [] data_ ;}
size_t size () const
{ return size_; }
float operator []( size_t i) const
{ return data_[i]; }
float & operator []( size_t i)
{ return data_[i]; }
...
private:
float * data_;
size_t size_;
};
2/5
Решение в стиле C: макросы
#define DEFINE_ARRAY (Name , Type )
struct Name { 
explicit Name(size_t size) 
: data_(new Type[size ]) 
, size_(size) {} 
~Name () { delete [] data_; } 

size_t size () const 
{ return size_; } 

Type operator []( size_t i) const 
{ return data_[i]; } 
Type & operator []( size_t i) 
{ return data_[i]; } 
... 
private: 
Type * data_; 
size_t size_; 
}
DEFINE_ARRAY (ArrayInt , int);
DEFINE_ARRAY (ArrayFlt , float );
int main ()
{
ArrayInt ai (10);
ArrayFlt af (20);
...
return 0;
}
3/5
Решение в стиле C++: шаблоны классов
template <class Type >
struct Array {
explicit Array(size_t size)
: data_(new Type[size ])
, size_(size) {}
~Array ()
{ delete [] data_; }
size_t size () const
{ return size_; }
Type operator []( size_t i) const
{ return data_[i]; }
Type & operator []( size_t i)
{ return data_[i]; }
...
private:
Type * data_;
size_t size_;
};
int main ()
{
Array <int > ai (10);
Array <float > af (20);
...
return 0;
}
4/5
Шаблоны классов с несколькими параметрами
template <class Type ,
class SizeT = size_t ,
class CRet = Type >
struct Array {
explicit Array(SizeT size)
: data_(new Type[size ])
, size_(size) {}
~Array () {delete [] data_ ;}
SizeT size () const {return size_ ;}
CRet operator []( SizeT i) const
{ return data_[i]; }
Type & operator []( SizeT i)
{ return data_[i]; }
...
private:
Type * data_;
SizeT size_;
};
void foo ()
{
Array <int > ai (10);
Array <float > af (20);
Array <Array <int >,
size_t ,
Array <int > const&>
da (30);
...
}
typedef Array <int > Ints;
typedef Array <Ints , size_t ,
Ints const &> IInts;
void bar ()
{
IInts da (30);
}
5/5

More Related Content

What's hot

Introduction to TDD in C
Introduction to TDD in CIntroduction to TDD in C
Introduction to TDD in C
Raphael Frauenknecht
 
Pendekatan Inversi Linier dengan Matriks Jacobi pada Kasus Perhitungan Hipose...
Pendekatan Inversi Linier dengan Matriks Jacobi pada Kasus Perhitungan Hipose...Pendekatan Inversi Linier dengan Matriks Jacobi pada Kasus Perhitungan Hipose...
Pendekatan Inversi Linier dengan Matriks Jacobi pada Kasus Perhitungan Hipose...Fajar Perdana
 
Los fantastico
Los fantasticoLos fantastico
Los fantastico
Brenda Jazmin
 
Tugas alpro 3.3
Tugas alpro 3.3Tugas alpro 3.3
Tugas alpro 3.31300018047
 
Eliminación gaussiana java codigo
Eliminación gaussiana java codigo Eliminación gaussiana java codigo
Eliminación gaussiana java codigo
Edwin Juracan
 
Nova microsoft word document
Nova microsoft word documentNova microsoft word document
Nova microsoft word document
Saša Ličina
 
Docuemnto 6
Docuemnto 6Docuemnto 6
Docuemnto 6
Diana597594
 
Tomografi Delay Time Sederhana
Tomografi Delay Time SederhanaTomografi Delay Time Sederhana
Tomografi Delay Time SederhanaFajar Perdana
 
Bcsl 033 data and file structures lab s1-2
Bcsl 033 data and file structures lab s1-2Bcsl 033 data and file structures lab s1-2
Bcsl 033 data and file structures lab s1-2
Dr. Loganathan R
 
Simulacion - Algoritmo congruencial cuadratico
Simulacion - Algoritmo congruencial cuadraticoSimulacion - Algoritmo congruencial cuadratico
Simulacion - Algoritmo congruencial cuadratico
José Antonio Sandoval Acosta
 
Python codigo graficas
Python codigo graficasPython codigo graficas
Python codigo graficas
Brayan Kalaka
 
Practica de matlab
Practica de matlabPractica de matlab
Practica de matlab
José Luis Farro
 
สรุปงานผู้ทดสอบ
สรุปงานผู้ทดสอบสรุปงานผู้ทดสอบ
สรุปงานผู้ทดสอบKittawan Pex Tampasert
 
Kelompok 2.5
Kelompok 2.5Kelompok 2.5
Kelompok 2.5
1300018075
 

What's hot (19)

program sederhana
program sederhanaprogram sederhana
program sederhana
 
Introduction to TDD in C
Introduction to TDD in CIntroduction to TDD in C
Introduction to TDD in C
 
ikp213-06-template-c++
ikp213-06-template-c++ikp213-06-template-c++
ikp213-06-template-c++
 
Pendekatan Inversi Linier dengan Matriks Jacobi pada Kasus Perhitungan Hipose...
Pendekatan Inversi Linier dengan Matriks Jacobi pada Kasus Perhitungan Hipose...Pendekatan Inversi Linier dengan Matriks Jacobi pada Kasus Perhitungan Hipose...
Pendekatan Inversi Linier dengan Matriks Jacobi pada Kasus Perhitungan Hipose...
 
Los fantastico
Los fantasticoLos fantastico
Los fantastico
 
Tugas alpro 3.3
Tugas alpro 3.3Tugas alpro 3.3
Tugas alpro 3.3
 
Java
Java Java
Java
 
Eliminación gaussiana java codigo
Eliminación gaussiana java codigo Eliminación gaussiana java codigo
Eliminación gaussiana java codigo
 
Nova microsoft word document
Nova microsoft word documentNova microsoft word document
Nova microsoft word document
 
Docuemnto 6
Docuemnto 6Docuemnto 6
Docuemnto 6
 
Tomografi Delay Time Sederhana
Tomografi Delay Time SederhanaTomografi Delay Time Sederhana
Tomografi Delay Time Sederhana
 
Bcsl 033 data and file structures lab s1-2
Bcsl 033 data and file structures lab s1-2Bcsl 033 data and file structures lab s1-2
Bcsl 033 data and file structures lab s1-2
 
Simulacion - Algoritmo congruencial cuadratico
Simulacion - Algoritmo congruencial cuadraticoSimulacion - Algoritmo congruencial cuadratico
Simulacion - Algoritmo congruencial cuadratico
 
Info clasa
Info clasaInfo clasa
Info clasa
 
Python codigo graficas
Python codigo graficasPython codigo graficas
Python codigo graficas
 
Trabajo de programacion
Trabajo de programacionTrabajo de programacion
Trabajo de programacion
 
Practica de matlab
Practica de matlabPractica de matlab
Practica de matlab
 
สรุปงานผู้ทดสอบ
สรุปงานผู้ทดสอบสรุปงานผู้ทดสอบ
สรุปงานผู้ทดสอบ
 
Kelompok 2.5
Kelompok 2.5Kelompok 2.5
Kelompok 2.5
 

Viewers also liked

2.5 Ссылки
2.5 Ссылки2.5 Ссылки
2.5 Ссылки
DEVTYPE
 
3.3 Конструкторы и деструкторы
3.3 Конструкторы и деструкторы3.3 Конструкторы и деструкторы
3.3 Конструкторы и деструкторы
DEVTYPE
 
1. Введение в Java
1. Введение в Java1. Введение в Java
1. Введение в Java
DEVTYPE
 
Программирование: теоремы и задачи
Программирование: теоремы и задачиПрограммирование: теоремы и задачи
Программирование: теоремы и задачи
DEVTYPE
 
3.2 Методы
3.2 Методы3.2 Методы
3.2 Методы
DEVTYPE
 
2.2 Стек вызовов
2.2 Стек вызовов2.2 Стек вызовов
2.2 Стек вызовов
DEVTYPE
 
6.3 Специализация шаблонов
6.3 Специализация шаблонов6.3 Специализация шаблонов
6.3 Специализация шаблонов
DEVTYPE
 
4.2 Перегрузка
4.2 Перегрузка4.2 Перегрузка
4.2 Перегрузка
DEVTYPE
 
5.4 Ключевые слова static и inline
5.4 Ключевые слова static и inline5.4 Ключевые слова static и inline
5.4 Ключевые слова static и inline
DEVTYPE
 
4.1 Наследование
4.1 Наследование4.1 Наследование
4.1 Наследование
DEVTYPE
 
2.8 Строки и ввод-вывод
2.8 Строки и ввод-вывод2.8 Строки и ввод-вывод
2.8 Строки и ввод-вывод
DEVTYPE
 
4.4 Таблица виртуальных методов
4.4 Таблица виртуальных методов4.4 Таблица виртуальных методов
4.4 Таблица виртуальных методов
DEVTYPE
 
2.4 Использование указателей
2.4 Использование указателей2.4 Использование указателей
2.4 Использование указателей
DEVTYPE
 
3.8 Класс массива
3.8 Класс массива3.8 Класс массива
3.8 Класс массива
DEVTYPE
 
5.1 Перегрузка операторов
5.1 Перегрузка операторов5.1 Перегрузка операторов
5.1 Перегрузка операторов
DEVTYPE
 
3.1 Структуры
3.1 Структуры3.1 Структуры
3.1 Структуры
DEVTYPE
 
Квадратичная математика
Квадратичная математикаКвадратичная математика
Квадратичная математика
DEVTYPE
 
6.2 Шаблоны функций
6.2 Шаблоны функций6.2 Шаблоны функций
6.2 Шаблоны функций
DEVTYPE
 
3.4 Объекты и классы
3.4 Объекты и классы3.4 Объекты и классы
3.4 Объекты и классы
DEVTYPE
 
2.7 Многомерные массивы
2.7 Многомерные массивы2.7 Многомерные массивы
2.7 Многомерные массивы
DEVTYPE
 

Viewers also liked (20)

2.5 Ссылки
2.5 Ссылки2.5 Ссылки
2.5 Ссылки
 
3.3 Конструкторы и деструкторы
3.3 Конструкторы и деструкторы3.3 Конструкторы и деструкторы
3.3 Конструкторы и деструкторы
 
1. Введение в Java
1. Введение в Java1. Введение в Java
1. Введение в Java
 
Программирование: теоремы и задачи
Программирование: теоремы и задачиПрограммирование: теоремы и задачи
Программирование: теоремы и задачи
 
3.2 Методы
3.2 Методы3.2 Методы
3.2 Методы
 
2.2 Стек вызовов
2.2 Стек вызовов2.2 Стек вызовов
2.2 Стек вызовов
 
6.3 Специализация шаблонов
6.3 Специализация шаблонов6.3 Специализация шаблонов
6.3 Специализация шаблонов
 
4.2 Перегрузка
4.2 Перегрузка4.2 Перегрузка
4.2 Перегрузка
 
5.4 Ключевые слова static и inline
5.4 Ключевые слова static и inline5.4 Ключевые слова static и inline
5.4 Ключевые слова static и inline
 
4.1 Наследование
4.1 Наследование4.1 Наследование
4.1 Наследование
 
2.8 Строки и ввод-вывод
2.8 Строки и ввод-вывод2.8 Строки и ввод-вывод
2.8 Строки и ввод-вывод
 
4.4 Таблица виртуальных методов
4.4 Таблица виртуальных методов4.4 Таблица виртуальных методов
4.4 Таблица виртуальных методов
 
2.4 Использование указателей
2.4 Использование указателей2.4 Использование указателей
2.4 Использование указателей
 
3.8 Класс массива
3.8 Класс массива3.8 Класс массива
3.8 Класс массива
 
5.1 Перегрузка операторов
5.1 Перегрузка операторов5.1 Перегрузка операторов
5.1 Перегрузка операторов
 
3.1 Структуры
3.1 Структуры3.1 Структуры
3.1 Структуры
 
Квадратичная математика
Квадратичная математикаКвадратичная математика
Квадратичная математика
 
6.2 Шаблоны функций
6.2 Шаблоны функций6.2 Шаблоны функций
6.2 Шаблоны функций
 
3.4 Объекты и классы
3.4 Объекты и классы3.4 Объекты и классы
3.4 Объекты и классы
 
2.7 Многомерные массивы
2.7 Многомерные массивы2.7 Многомерные массивы
2.7 Многомерные массивы
 

More from DEVTYPE

Рукописные лекции по линейной алгебре
Рукописные лекции по линейной алгебреРукописные лекции по линейной алгебре
Рукописные лекции по линейной алгебре
DEVTYPE
 
1.4 Точечные оценки и их свойства
1.4 Точечные оценки и их свойства1.4 Точечные оценки и их свойства
1.4 Точечные оценки и их свойства
DEVTYPE
 
1.3 Описательная статистика
1.3 Описательная статистика1.3 Описательная статистика
1.3 Описательная статистика
DEVTYPE
 
1.2 Выборка. Выборочное пространство
1.2 Выборка. Выборочное пространство1.2 Выборка. Выборочное пространство
1.2 Выборка. Выборочное пространство
DEVTYPE
 
Continuity and Uniform Continuity
Continuity and Uniform ContinuityContinuity and Uniform Continuity
Continuity and Uniform Continuity
DEVTYPE
 
Coin Change Problem
Coin Change ProblemCoin Change Problem
Coin Change Problem
DEVTYPE
 
Recurrences
RecurrencesRecurrences
Recurrences
DEVTYPE
 
D-кучи и их применение
D-кучи и их применениеD-кучи и их применение
D-кучи и их применение
DEVTYPE
 
Диаграммы Юнга, плоские разбиения и знакочередующиеся матрицы
Диаграммы Юнга, плоские разбиения и знакочередующиеся матрицыДиаграммы Юнга, плоские разбиения и знакочередующиеся матрицы
Диаграммы Юнга, плоские разбиения и знакочередующиеся матрицы
DEVTYPE
 
ЖАДНЫЕ АЛГОРИТМЫ
ЖАДНЫЕ АЛГОРИТМЫ ЖАДНЫЕ АЛГОРИТМЫ
ЖАДНЫЕ АЛГОРИТМЫ
DEVTYPE
 
Скорость роста функций
Скорость роста функцийСкорость роста функций
Скорость роста функций
DEVTYPE
 
Asymptotic Growth of Functions
Asymptotic Growth of FunctionsAsymptotic Growth of Functions
Asymptotic Growth of Functions
DEVTYPE
 
Кучи
КучиКучи
Кучи
DEVTYPE
 
Кодирование Хаффмана
Кодирование ХаффманаКодирование Хаффмана
Кодирование Хаффмана
DEVTYPE
 
Жадные алгоритмы: введение
Жадные алгоритмы: введениеЖадные алгоритмы: введение
Жадные алгоритмы: введение
DEVTYPE
 
Разбор задач по дискретной вероятности
Разбор задач по дискретной вероятностиРазбор задач по дискретной вероятности
Разбор задач по дискретной вероятности
DEVTYPE
 
Разбор задач модуля "Теория графов ll"
Разбор задач модуля "Теория графов ll"Разбор задач модуля "Теория графов ll"
Разбор задач модуля "Теория графов ll"
DEVTYPE
 
Наибольший общий делитель
Наибольший общий делительНаибольший общий делитель
Наибольший общий делитель
DEVTYPE
 
Числа Фибоначчи
Числа ФибоначчиЧисла Фибоначчи
Числа Фибоначчи
DEVTYPE
 
О-символика
О-символикаО-символика
О-символика
DEVTYPE
 

More from DEVTYPE (20)

Рукописные лекции по линейной алгебре
Рукописные лекции по линейной алгебреРукописные лекции по линейной алгебре
Рукописные лекции по линейной алгебре
 
1.4 Точечные оценки и их свойства
1.4 Точечные оценки и их свойства1.4 Точечные оценки и их свойства
1.4 Точечные оценки и их свойства
 
1.3 Описательная статистика
1.3 Описательная статистика1.3 Описательная статистика
1.3 Описательная статистика
 
1.2 Выборка. Выборочное пространство
1.2 Выборка. Выборочное пространство1.2 Выборка. Выборочное пространство
1.2 Выборка. Выборочное пространство
 
Continuity and Uniform Continuity
Continuity and Uniform ContinuityContinuity and Uniform Continuity
Continuity and Uniform Continuity
 
Coin Change Problem
Coin Change ProblemCoin Change Problem
Coin Change Problem
 
Recurrences
RecurrencesRecurrences
Recurrences
 
D-кучи и их применение
D-кучи и их применениеD-кучи и их применение
D-кучи и их применение
 
Диаграммы Юнга, плоские разбиения и знакочередующиеся матрицы
Диаграммы Юнга, плоские разбиения и знакочередующиеся матрицыДиаграммы Юнга, плоские разбиения и знакочередующиеся матрицы
Диаграммы Юнга, плоские разбиения и знакочередующиеся матрицы
 
ЖАДНЫЕ АЛГОРИТМЫ
ЖАДНЫЕ АЛГОРИТМЫ ЖАДНЫЕ АЛГОРИТМЫ
ЖАДНЫЕ АЛГОРИТМЫ
 
Скорость роста функций
Скорость роста функцийСкорость роста функций
Скорость роста функций
 
Asymptotic Growth of Functions
Asymptotic Growth of FunctionsAsymptotic Growth of Functions
Asymptotic Growth of Functions
 
Кучи
КучиКучи
Кучи
 
Кодирование Хаффмана
Кодирование ХаффманаКодирование Хаффмана
Кодирование Хаффмана
 
Жадные алгоритмы: введение
Жадные алгоритмы: введениеЖадные алгоритмы: введение
Жадные алгоритмы: введение
 
Разбор задач по дискретной вероятности
Разбор задач по дискретной вероятностиРазбор задач по дискретной вероятности
Разбор задач по дискретной вероятности
 
Разбор задач модуля "Теория графов ll"
Разбор задач модуля "Теория графов ll"Разбор задач модуля "Теория графов ll"
Разбор задач модуля "Теория графов ll"
 
Наибольший общий делитель
Наибольший общий делительНаибольший общий делитель
Наибольший общий делитель
 
Числа Фибоначчи
Числа ФибоначчиЧисла Фибоначчи
Числа Фибоначчи
 
О-символика
О-символикаО-символика
О-символика
 

6.1 Шаблоны классов

  • 1. Программирование на языке C++ Лекция 6 Шаблоны классов Александр Смаль 1/5
  • 2. Проблема “одинаковых классов” struct ArrayInt { explicit ArrayInt(size_t size) : data_(new int[size ]) , size_(size) {} ~ArrayInt () {delete [] data_ ;} size_t size () const { return size_; } int operator []( size_t i) const { return data_[i]; } int & operator []( size_t i) { return data_[i]; } ... private: int * data_; size_t size_; }; struct ArrayFlt { explicit ArrayFlt(size_t size) : data_(new float[size ]) , size_(size) {} ~ArrayFlt () {delete [] data_ ;} size_t size () const { return size_; } float operator []( size_t i) const { return data_[i]; } float & operator []( size_t i) { return data_[i]; } ... private: float * data_; size_t size_; }; 2/5
  • 3. Решение в стиле C: макросы #define DEFINE_ARRAY (Name , Type ) struct Name { explicit Name(size_t size) : data_(new Type[size ]) , size_(size) {} ~Name () { delete [] data_; } size_t size () const { return size_; } Type operator []( size_t i) const { return data_[i]; } Type & operator []( size_t i) { return data_[i]; } ... private: Type * data_; size_t size_; } DEFINE_ARRAY (ArrayInt , int); DEFINE_ARRAY (ArrayFlt , float ); int main () { ArrayInt ai (10); ArrayFlt af (20); ... return 0; } 3/5
  • 4. Решение в стиле C++: шаблоны классов template <class Type > struct Array { explicit Array(size_t size) : data_(new Type[size ]) , size_(size) {} ~Array () { delete [] data_; } size_t size () const { return size_; } Type operator []( size_t i) const { return data_[i]; } Type & operator []( size_t i) { return data_[i]; } ... private: Type * data_; size_t size_; }; int main () { Array <int > ai (10); Array <float > af (20); ... return 0; } 4/5
  • 5. Шаблоны классов с несколькими параметрами template <class Type , class SizeT = size_t , class CRet = Type > struct Array { explicit Array(SizeT size) : data_(new Type[size ]) , size_(size) {} ~Array () {delete [] data_ ;} SizeT size () const {return size_ ;} CRet operator []( SizeT i) const { return data_[i]; } Type & operator []( SizeT i) { return data_[i]; } ... private: Type * data_; SizeT size_; }; void foo () { Array <int > ai (10); Array <float > af (20); Array <Array <int >, size_t , Array <int > const&> da (30); ... } typedef Array <int > Ints; typedef Array <Ints , size_t , Ints const &> IInts; void bar () { IInts da (30); } 5/5