Similar presentations:
Объектно-ориентированное программирование. Языки C++ и C#. 11 класс
1.
Объектно-ориентированное программирование. Языки C++ и C#. 11 классДЗ от 07.06.24
Тема: Шаблоны классов
1
Задача 1. Отработка новых навыков
Реализовать пример кода из видео:
https://www.youtube.com/watch?v=SDRMUgJwro0&t=636s
-------------------------------------------------------------------------------------Задача 2. Закрепление новых навыков
Доработать вышеописанный код из видео:
Дописать реализацию класса «MyClass» таким образом, чтобы в функции
“int main” можно было объявить объект этого класса с набором из четырех аргументов
Пример:
MyClass <int, double, string, bool> c (a, b, c ,d);
где [a,b,c,d] – это наименование переменных с соответствующим типом по порядку.
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
2.
ЯЗЫКИ ПРОГРАММИРОВАНИЯ2
Шаблоны
Политехнический колледж имени П.А. Овчинникова
Никитин Михаил Евгеньевич, 2015
3.
Введение3
Шаблоны обеспечивают простой способ введения
разного рода общих концепций и простые
методы их совместного использования.
Шаблоны обеспечивают непосредственную
поддержку обобщенного программирования, то
есть программирования с использованием типов
в качестве параметров.
Политехнический колледж имени П.А. Овчинникова
Никитин Михаил Евгеньевич, 2015
4.
Введение4
Механизм шаблонов в С++ допускает
использование типа в качестве параметра при
определении класса или функции.
Шаблон зависит только от тех свойств
параметра-типа, которые он явно использует, и
не требует, чтобы различные типы,
используемые в качестве аргументов, были
связаны каким-либо другим образом.
Политехнический колледж имени П.А. Овчинникова
Никитин Михаил Евгеньевич, 2015
5.
Введение5
Стандартная библиотека должна обеспечивать
большую степень общности, гибкости и
эффективности, чем большинство других
программ.
Каждая существенная абстракция в стандартной
библиотеке представлена в виде шаблона
(например, string, ostream, complex, list и
map), также как и все ключевые операции
(например, сравнение строк, оператор вывода << ,
комплексное сложение, доступ к следующему
элементу списка и сортировка).
Политехнический колледж имени П.А. Овчинникова
Никитин Михаил Евгеньевич, 2015
6.
Простой шаблон строк6
Строка является классом, который хранит
символы и предоставляет операции, такие как
доступ по индексу, конкатенацию и сравнение,
которые мы обычно ассоциируем с понятием
«строка».
Мы хотели бы реализовать такое поведение для
многих наборов символов.
Политехнический колледж имени П.А. Овчинникова
Никитин Михаил Евгеньевич, 2015
7.
Простой шаблон строк7
class String {
char* str;
int n;
public:
String(),
String(const char*);
String(const String&);
char read(int i) const;
};
Политехнический колледж имени П.А. Овчинникова
Никитин Михаил Евгеньевич, 2015
8.
Простой шаблон строк8
А что если надо использовать wchar_t?
А если мы пишем класс для очереди. Для
каждого типов данных исходных элементов
писать свой класс?
Как написать общий класс, который позволил бы
работать с «любыми» типами данных?
Политехнический колледж имени П.А. Овчинникова
Никитин Михаил Евгеньевич, 2015
9.
9Любой шаблон начинается со слова template,
будь то шаблон функции или шаблон класса.
После ключевого слова template идут угловые
скобки — < >, в которых перечисляется список
параметров шаблона.
Каждому параметру должно предшествовать
зарезервированное слово class или typename.
Политехнический колледж имени П.А. Овчинникова
Никитин Михаил Евгеньевич, 2015
10.
10Некоторые примеры объявления шаблонов:
template <class T>
template <typename T>
template <typename T1, typename T2>
Политехнический колледж имени П.А. Овчинникова
Никитин Михаил Евгеньевич, 2015
11.
11Ключевое слово typename говорит о том, что в
шаблоне будет использоваться встроенный тип
данных, такой как: int, double, float, char и т. д.
Ключевое слово class сообщает компилятору, что
в шаблоне функции в качестве параметра будут
использоваться пользовательские типы данных,
то есть классы.
Политехнический колледж имени П.А. Овчинникова
Никитин Михаил Евгеньевич, 2015
12.
Простой шаблон строк12
template<class Ch> class String{
Ch* str;
int n;
public:
String(),
String(const Ch*);
String(const String&);
Сh read(int i) const;
// ....
};
Политехнический колледж имени П.А. Овчинникова
Никитин Михаил Евгеньевич, 2015
13.
Простой шаблон строк13
Префикс template<class Ch> указывает, что
объявлен шаблон (template) и что аргумент
Сh будет использован в объявлении как тип.
После объявления Сh используется точно
также, как имена других типов.
Область видимости Сh простирается до конца
объявления, начинающегося с template<class
Сh>. Обратите внимание, что template<class
Сh> означает, что Сh — это имя
пользовательского типа, а не обязательно
имя класса
Политехнический колледж имени П.А. Овчинникова
Никитин Михаил Евгеньевич, 2015
14.
Простой шаблон строк14
Имя шаблона класса, за которым следует тип,
помещенный в угловые скобки < >, является
именем класса (определяемого шаблоном) и его
можно использовать точно также, как имена
других классов.
Примеры
String<char> cs;
String<unsigned char> us;
String<wchar_t> ws;
class Jchar {
// японские символы
};
String<Jchar> js;
Политехнический колледж имени П.А. Овчинникова
Никитин Михаил Евгеньевич, 2015
15.
Простой шаблон строк15
За исключением специального синтаксиса своего
имени String<char> работает точно также, как
если бы он был определен как String.
То, что мы сделали String шаблоном, позволит
нам реализовать средства, которые мы ввели для
строк char, для строк с любыми символами.
Политехнический колледж имени П.А. Овчинникова
Никитин Михаил Евгеньевич, 2015
16.
Простой шаблон строк16
#include <iostream>
#include <map>
using namespace std;
template<class Ch> class String{
// ....
};
int main() // подсчет количества вхождений каждого слова
{
String<char> buf;
map<String<char>, int> m;
while (cin>>buf) m[buf]++;
}
Политехнический колледж имени П.А. Овчинникова
Никитин Михаил Евгеньевич, 2015
17.
Простой шаблон строк17
#include <iostream>
#include <map>
using namespace std;
template<class Ch> class String{
// ....
};
class Jchar {
// японские символы
};
int main() // подсчет количества вхождений каждого слова
{
String<Jchar> buf;
map<String<Jchar>, int> m;
while (cin>>buf) m[buf]++;
}
Политехнический колледж имени П.А. Овчинникова
Никитин Михаил Евгеньевич, 2015
18.
Простой шаблон строк18
Стандартная библиотека предоставляет шаблон
класса basic string. В стандартной библиотеке
string определен как синоним
basic_string<char>:
typedef basic_string<char> string;
Политехнический колледж имени П.А. Овчинникова
Никитин Михаил Евгеньевич, 2015
19.
Определение шаблона19
Класс, генерируемый из шаблона класса,
является совершенно нормальным классом.
Поэтому использование шаблона не
подразумевает каких-либо дополнительных
механизмов времени выполнения сверх тех, что
использовались бы для эквивалентного
написанного «вручную» класса.
Политехнический колледж имени П.А. Овчинникова
Никитин Михаил Евгеньевич, 2015
20.
Определение шаблона20
Как правило, неплохой идеей является
протестировать конкретный класс, например
String, до преобразования его в шаблон
(String<Ch>).
Поступая таким образом, мы решаем многие
проблемы проектирования и обнаруживаем
большую часть ошибок кода в контексте
конкретного примера.
Политехнический колледж имени П.А. Овчинникова
Никитин Михаил Евгеньевич, 2015
21.
Определение шаблона21
Члены шаблона класса объявляются и
определяются точно также, как и для обычного
класса.
Член шаблона не обязательно определять внутри
самого шаблона.
Члены шаблона класса в свою очередь являются
шаблонами, параметризованными при помощи
аргументов шаблона.
Политехнический колледж имени П.А. Овчинникова
Никитин Михаил Евгеньевич, 2015
22.
Определение шаблона22
template<class Ch> class String{
struct Srep;
Srep *rep;
public:
String(),
String(const Ch*);
String(const String&);
Сh read(int i) const;
// ....
};
template <class Сh> String<Сh>::String()
{
str = new Сh();
n = 0;
}
Политехнический колледж имени П.А. Овчинникова
Никитин Михаил Евгеньевич, 2015
23.
Определение шаблона23
template<class Ch> class String{
Ch* str;
int n;
public:
String();
friend istream& operator>> <Ch>(istream& io, String<Ch>& str);
friend ostream& operator<< <Ch>(ostream& io, String<Ch>& str);
// ....
};
template<class Ch> istream& operator>>(istream& io, String<Ch>& _str)
{
io >> _str.str;
return io;
}
template<class Ch> ostream& operator<<(ostream& io, String<Ch>& _str)
{
io << _str.str;
return io;
}
Политехнический колледж имени П.А. Овчинникова
Никитин Михаил Евгеньевич, 2015
24.
Инстанцирование24
Процесс генерации объявления класса по
шаблону класса и аргументу шаблона часто
называется инсшанцированием шаблона
(template instantiation)
Аналогично, функция генерируется
(«инстанцируется») из шаблона функции и
аргумента шаблона.
Версия шаблона для конкретного аргумента
шаблона называется специализацией.
Политехнический колледж имени П.А. Овчинникова
Никитин Михаил Евгеньевич, 2015
25.
Инстанцирование25
Генерация версий функций шаблона для набора
аргументов шаблона является задачей компилятора,
а не программиста.
String<char> cs;
void f()
{
String<Jchar> js;
cs = "Какой код сгенерировать, решает
компилятор";
}
Политехнический колледж имени П.А. Овчинникова
Никитин Михаил Евгеньевич, 2015
26.
26В этом случае компилятор генерирует
объявления для String<char> и
String<Jchar>, для их соответствующих типов,
для их деструкторов и конструкторов по
умолчанию и для присваивания
String<char>::operator= (char*) и т.д.
Политехнический колледж имени П.А. Овчинникова
Никитин Михаил Евгеньевич, 2015
27.
27Сгенерированные классы являются совершенно
обычными классами, которые подчиняются всем
стандартным правилам для классов.
Аналогично, сгенерированные функции
являются обычными функциями, которые
подчиняются всем стандартным правилам для
функций.
Политехнический колледж имени П.А. Овчинникова
Никитин Михаил Евгеньевич, 2015