Скачать презентацию
Идет загрузка презентации. Пожалуйста, подождите
Презентация была опубликована 11 лет назад пользователемoocities.org
1 Задачи на 28 апреля Язык С++1
2 Задача 3: swp template void swp(T& x, T& y) { T tmp = x; x = y; y = tmp; } Замечание: T tmp;// Так хуже, чем T tmp = x; tmp = x; - Немного медленнее - Более существенно, работает только если в классе есть конструктор по умолчанию (определение менее общее). Язык С++2
3 Задача 1: Удаление кружка - план OnRButtonDown Ищем кружок, в который мы попали Если нашли, то удаляем Перерисовываем Язык С++3
4 Задача 1: Удаление кружка void CCirclesView::OnRButtonDown(UINT nFlags, CPoint point) { vector ::iterator p; for (p=m_circles.begin(); p != m_circles.end(); p++) { if ( (p->x - pt.x)*(p->x - pt.x) + (p->y - pt.y)*(p->y - pt.y)
5 Архитектура "Документ/представление" (Document-View) Язык С++5
6 Тут мы обсуждали, почему лучше иметь два класса – один для данных, и другой для их изображения
7 Архитектура Document-View Данные хранятся не в окне, а в отдельном классе (C…Doc, производный от CDocument) Взаимодействие: Из окна можно получить указатель на документ: pDoc = GetDocument(); Можно обновить окно для документа (или окна, их может быть несколько): UpdateAllViews(NULL); Почему удобно использовать такую архитектуру? Несколько окон для одного документа Несколько способов просмотра Вообще часто полезно разделять объект и его изображение Примерно то же: MVC (model-view-controler). Язык С++7
8 Circles в архитектуре Document-View m_circles - перенести в CCirclesDoc class CCirclesDoc { vector m_circles; OnDraw: CCirclesDoc* pDoc= GetDocument(); for (int i = 0; i m_circles.size(); i++) { CPoint& pt = pDoc->m_circles[i]; pDC->Ellipse(pt.x – 10, pt.y – 10, pt.x + 10, pt.y + 10, } OnLButtonDown: CCirclesDoc* pDoc= GetDocument(); pDoc->m_circles.push_back(point); pDoc->UpdateAllViews(NULL); Язык С++8
9 Шаблоны классов Язык С++9
s4; При использован" title="Пример: шаблон класса "стек" template class stack { T stk[100]; int size; public: stack() : size(0) {} void push(const T& x) { size[top++] = x; } T pop { return stk[--size]; } }; Использование stack s1; stack s2; stack s3; stack > s4; При использован" class="link_thumb"> 10 Пример: шаблон класса "стек" template class stack { T stk[100]; int size; public: stack() : size(0) {} void push(const T& x) { size[top++] = x; } T pop { return stk[--size]; } }; Использование stack s1; stack s2; stack s3; stack > s4; При использовании параметры надо указывать явно Язык С++10 s4; При использован"> s4; При использовании параметры надо указывать явно Язык С++10"> s4; При использован" title="Пример: шаблон класса "стек" template class stack { T stk[100]; int size; public: stack() : size(0) {} void push(const T& x) { size[top++] = x; } T pop { return stk[--size]; } }; Использование stack s1; stack s2; stack s3; stack > s4; При использован">
11 Замечания Методы можно описывать вне класса template void stack ::push(const T& x) {... } В частности, конструктор: template stack ::stack(): size(0) {} Язык С++11
12 Еще возможности Не типовые параметры: template class stack { T stk[maxsize]; … }; stack s; Такие параметры м.б. только целые (и в некоторых случаях указатели) При вызове д.б. константы Внутри - как константы Параметры по умолчанию template class stack { … stack s; // To же, что stack Язык С++12
13 typename Пусть в разных классах определен один вложенный тип. class a { typedef int mytype; … }; class b { typedef double mytype; … }; class c { typedef bool mytype; … }; И мы пишем шаблон, в котором используем это. template void f(T x) { … T::mytype x; … } Проблема: Откуда компилятор знает, что T::mytype это тип (а не поле T или метод T и т.д.)? Приходится подсказывать.. Язык С++13
14 typename - продолжение template void f(T x) { … typename T::mytype y; … } typename относится к выражению T::mytype Означает: "мы обещаем, что при вызове это будет вложенный в T тип" Язык С++14
15 Специализация Специализация шаблона template class stack { // Что-то особенное }; Специализация метода template void stack :: push(double x) { // Что-то особенное }; Реальный пример из STL – vector Язык С++15
16 Частичная специализация template class stack { // Что-то особенное }; М.б. сложная система разных специализаций template class abc { … }; template class abc { … }; template class abc { … }; template class abc { … }; template class abc { … }; Не во всех компиляторах! (Visual C++ после VS 2003) Язык С++16
17 Шаблон метода class abc { … template void f(T x) { … } … }; abc x; x.f(5);// f x.f(3.14);// f // Пример template class complex { T re, im; … template complex(const T1& from) : re(from.re), im(from.im) {} }; // Хотим задать преобразование // complex -> complex complex c1(1,2); complex c2 = c1; Генерируется конструктор complex (const complex & from) Язык С++17
18 Параметры - шаблоны Не будет на экзамене template class T > class abc { T x; T y; T z; … }; abc v; Язык С++18
19 Замечания Пишем код, который работает для разных типов. Называется: полиморфизм Статический полиморфизм По-моему опыту: Не старайтесь использовать сложные возможности шаблонов Легко запутаться Язык С++19
20 Еще об итераторах и контейнерах
21 value_type T::value_type – тип того, что содержится в контейнере Например, если T – это list, то T::value_type – это int И тоже для итераторов Если T – это list ::iterator, то T::value_type – это int Используется, в основном, в шаблонах Тут мы разбирали простой пример использования: шаблон функции, которая возвращает первый элемент любого последовательного контейнера. И обсудили типичные ошибки.
22 Разделяемые данные (В частности, разделяемая память и когда ее удалять) Язык С++22
23 Несколько указателей на один объект в динамической памяти Вспомним проблемы при копировании string: Меняем одну строку – меняются все Ну, допустим, мы не меняем строки (immutable objects) Оставшиеся проблемы одним предложением:непонятно, когда удалять Один из вариантов решения – счетчик указателей При объекте храним количество указателей, которые на него указывают Тогда можем сказать, когда можно удалить (когда счетчик уменьшился до 0) Язык С++23
24 Строки с разделяемым содержимым // Пример: shared_string s1 = abc; shared_string s2 = klm; s2 = s1; // klm освобождается. На abc – 2 указателя. shared_string s3 = pqr; s1 = s3; // На abc – 1 указатель. s2 = s3; // abc удаляется Где хранить счетчик? Мы не можем хранить в классе shared_string, его тоже надо разделять для нескольких shared_string Вариант (м.б. не лучший) – в первом байте строки. Но возможны и другие решения Язык С++24
25 Программы из нескольких исходных файлов Язык С++25
26 Программа из нескольких файлов -1 Схема a.cpp b.cpp компилируем... а.obj b.obj linker … a.exe (или a.dll) Как определить что-то в одном файле, а использовать в другом? a.cpp void f(int i) { … } b.cpp … f(56); … // f надо объявить
27 Программа из нескольких файлов -2 a.cpp void f(int i) { … } b.cpp void f(int i);... … f(56); … // ОК, так все работает, но: // обычно так не делают! Почему? Неудобно, особенно если файлов много При изменениях надо много где исправлять Легко забыть исправить.
28 Программа из нескольких файлов – обычно пишут так: Директива include: #include смысл: включить в это место текст из файла a.cpp void f(int i) { … } a.h void f(int i); b.cpp #include a.h... … f(56); … с.cpp #include a.h... … f(42); … В a.h – все, что другие должны знать о a.cpp (все необходимые объявления)
29 Как добавить в проект новые файлы? Пусть мы хотим добавить в проект новый cpp файл. В Visual Studio это делается так: В меню выберите Project + Add New Item… В форме выберите в списке «С++ File (.cpp)» и в поле Name введите имя файла. Чтобы добавить новый h файл надо сделать то же самое, но в списке выбрать «Header File (.h)» Если не будет получаться – пишите, я подскажу.
30 Задачи на 5 мая Язык С++30
31 Задачи на 5 мая «Разные фигурки» Написать программу типа Circles, которая позволяет задавать картинки из каких-нибудь трех видов фигур (например, кружки, квадраты и ромбы). Д.б. возможность добавлять и удалять. Перемещение можно не реализовывать. Как выбирать фигуру для добавления? Один вариант: в меню выбираeм "текущую фигуру". О работе с меню будет документ на сайте. За эту задачу 2 балла – один за добавление и один за удаление. 2. Опишите шаблон функции, которая для любого последовательного контейнера (списка, вектора, deque) ищет сумму входящих в него положительных элементов. Замечание: шаблон должен работать не только для контейнеров из целых чисел, но и для вещественных, rational и т.д. (Продолжение на следующем слайде) Язык С++31
32 Задачи на 5 мая – 2 3. Шаблон fixed_queue - очередь фиксированной длины (аналог stack, но first in – first out). // Пример использованмя queue q; q.push(3); q.push(7); q.push(11); cout
33 Задачи на 5 мая – 3 5. Написать функцию, которая для целого числа проверяет, совершенное оно или нет, и возвращает true или false. Справка: число называется совершенным, если оно равно сумме своих делителей. Например: 28 = Что для такой функции д.б. написано в cpp файле, и что в h файле? Дополнительное пожелание: Желательно, чтобы функция работала по возможности быстро.
Еще похожие презентации в нашем архиве:
© 2024 MyShared Inc.
All rights reserved.