Содержание
- 2. Программирование 5, 6 модули (Объектно-ориентированное программирование) МИЭМ НИУ ВШЭ, Клышинский Э.С. 2013 г.
- 3. Рекомендуемая литература М. Шлее Qt 4.8. Профессиональное программирование на C++ (655 руб.) Б. Страуструп Программирование. Принципы
- 4. Введение Как мы будем жить
- 5. Жизненная философия Шу (семинары и лабораторные) – ученик не способен задать правильные вопросы и понять ответы
- 6. Жизненная философия У нас нет времени делать это последовательно!
- 7. Как быть хорошим программистом The first requirement for programming is a passion for the work, a
- 8. Как быть хорошим программистом The second requirement is a high tolerance for failure. Programming is the
- 9. Как быть хорошим программистом You need the willingness to fail all the time. You have to
- 10. Что нам предстоит Лекции Семинары Лабораторные работы (5 модуль): Разработка контейнера. Визуальный интерфейс для разработанного контейнера,
- 11. Система оценок Лабораторные работы (5 модуль): 1 – 1 балл, 2 – 1 балл, 3 –
- 12. Система оценок Указанные баллы являются максимумом, который можно получить за работу. Наличие обоснованных претензий у преподавателя
- 13. Система оценок К хорошим программистом приходит Дед Мороз. К плохим – DeadLine.
- 14. Система оценок По лабораторным работам назначается срок сдачи. Если работа сдается на неделю позже по вине
- 15. Система оценок Лабораторные работы, выполненные в противоречии правилам хорошего тона НЕ ПРИНИМАЮТСЯ!!!
- 16. Система оценок Если сумма баллов за ниже 4 баллов, берется целая часть от полученной суммы. Если
- 17. Курсовая работа (л/р №4) Команда из n∈[1;2] человек должны написать n*[400;600] строк кода по выбранной теме.
- 18. Курсовая работа Команда из n∈[1;2] человек должны написать n*[400;600] строк кода по выбранной теме. Требования на
- 19. Курсовая работа Команда из n∈[1;2] человек должны написать n*[400;600] строк кода по выбранной теме. Требования на
- 20. Лекция 1,2 Основные понятия
- 21. Иерархия языков Процедурное программирование Ассемблер Структурное программирование Объектно-ориентированное программирование Что понимает компьютер. Как человеку проще записывать
- 22. Понятие объекта и класса Весь мир состоит из объектов, поэтому человеку проще манипулировать именно объектами, а
- 23. Понятие объекта и класса Что объединяет эти вещи?
- 24. Понятие объекта и класса Стул — мебельное изделие для сидения одного человека, со спинкой, с подлокотниками
- 25. Понятие объекта и класса Стул — мебельное изделие для сидения одного человека, со спинкой, с подлокотниками
- 26. Понятие объекта и класса Стул — мебельное изделие для сидения одного человека, со спинкой, с подлокотниками
- 27. Понятие объекта и класса Класс = данные + методы работы с ними
- 28. Понятие объекта и класса Эйдос Платона - то подлинное, что дается в умопостижении, в отвлечении от
- 29. Понятие объекта и класса Класс – некоторый шаблон, описывающий создаваемые объекты (эйдос, идея). Объекты – фрагменты
- 30. Понятие объекта и класса Класс (шаблон) class Ui_MainWindow { public: QWidget *centralWidget; QLineEdit *Pix_path; QPushButton *pushButton_3;
- 31. Абстракция Буч Г. Объектно-ориентированный анализ и проектирование
- 32. Классом может быть и абстрактная сущность - ...начинается на _M_, - продолжала она. - Они рисовали
- 33. Классом может быть и абстрактная сущность - ...начинается на _M_, - продолжала она. - Они рисовали
- 34. Классом может быть и абстрактная сущность Множество Свойства: массив элементов, количество элементов в массиве Методы: добавить
- 35. Классом может быть и абстрактная сущность Заслуга Свойства: дата, место, наименование Методы: отобразить, установить дату (в
- 36. Достоинства: модульность Буч Г. Объектно-ориентированный анализ и проектирование
- 37. Достоинства: простота Буч Г. Объектно-ориентированный анализ и проектирование
- 38. Инкапсуляция Механизм языка программирования, ограничивающий доступ к составляющим объект компонентам (методам и свойствам), делает их приватными,
- 39. Инкапсуляция Следует различать интерфейс класса, то есть то, что он предоставляет для использования другим фрагментам кода,
- 40. Синтаксис class TheClassName // class имя_класса { public: // Магической слово int property1; // свойства класса
- 41. Синтаксис class TheClassName // порядок не важен { public: // Магической слово double property2, property3; int
- 42. Синтаксис class TheClassName // порядок не важен {public:double property2,property3;int methodFoo(int a,char*b);int property1;float methodBar();}; // Да, как
- 43. Синтаксис int TheClassName::methodFoo(int a, char *b) { property3=a; property1=strlen(b); return 0; } float TheClassName::methodBar() { property2=0;
- 44. Синтаксис #include “myclass.h” int main() {TheClassName obj1, *obj2=&obj1; obj1.property1=0; obj1.methodBar(); obj2->methodFoo(10, “строка”); }
- 45. Синтаксис class TheClassName2 // { public: TheClassName *objects; int count; void add(TheClassName &obj); void delete(int pos);
- 46. Синтаксис class TheClassName2 // { public: TheClassName *objects; int count; void add(TheClassName &obj); void delete(int pos);
- 47. Область видимости public – то, что написано в этой строке будет доступно «снаружи» класса. public: –
- 48. Область видимости По умолчанию свойства и методы класса являются private, поэтому забыв написать public мы лишаем
- 49. Область видимости Общее правило. По умолчанию всё, что не обязано быть доступно снаружи, обязано быть private.
- 50. Область видимости Общее правило. Правила хорошего тона предписывают описать сперва открытые члены класса, а потом закрытые.
- 51. Пример Мы пишем экономическую стратегию (игра). Необходимо создать класс, описывающий источник ресурсов. Время дискретно, внешний класс
- 52. Пример Свойства: название ресурса, количество ресурса, производительность, интервал производства, количество произведенных ресурсов, число работников, максимальное число
- 53. Пример class Mine // Часть свойств опущено { public: char *resName; // Имя ресурса // Сколько
- 54. Пример bool Mine::tick() {double tmp; curTime++; if( curTime>=interval ) {curTime = 0; tmp = ((double) workerCount)
- 55. Пример использования int main() {Mine mn; mn.maxWorkerCount=0; mn.productivity=-1 mn.resName=(0xFACE8D00); mn.tick(); } И кого будут ругать?
- 56. Первый принцип программиста КРУГОМ ВРАГИ! Пишите код так, как будто сопровождать его будет склонный к насилию
- 57. Второй принцип программиста Надо инициализировать переменные Буратино дали пять яблок, сколько яблок у него стало? Неизвестно,
- 58. Третий принцип программиста Работа выполнена, если за нее заплачены деньги. (Раз уж мы об этом заговорили.)
- 59. Четвертый принцип программиста КОПИРОВАНИЕ – ЗЛО! (Раз уж мы об этом заговорили.)
- 60. Как быть? Принцип 1 вступает в противоречие с принципом 2. Мы не можем спрятать переменные, так
- 61. Как быть? Надо завести функцию инициализации и спрятать все данные! Но наши коллеги забудут ее вызвать.
- 62. Конструктор В объектно-ориентированном программировании конструктор класса – специальный блок инструкций, вызываемый при создании объекта.
- 63. Деструктор В объектно-ориентированном программировании деструктор класса – специальный блок инструкций, вызываемый при уничтожении объекта.
- 64. Пример class Mine {public: Mine(); // Конструктор по умолчанию Mine(char *name, int amount, int prdctvt, int
- 65. Пример private: char *resName; // Имя ресурса // Сколько есть ресурса, сколько произведено int overall, produced;
- 66. Пример Mine::Mine() {resName=NULL; overall=0; produced=0; workerCount=0; maxWorkerCount=0; // И так далее }
- 67. Пример Mine::Mine(char *name, int amount, int prdctvt, int intrvl) {resName=new char [strlen(name)]; overall=amount; produced=0; workerCount=0; maxWorkerCount=0;
- 68. Пример bool Mine::addWorker() {if( workerCount == maxWorkerCount ) return false; workerCount++; return true; } bool Mine::getWorker()
- 69. Пример int main() {Mine mine1; Mine mine2(“Mine2”, 100, 1, 50); Mine mine3(mine2); // Дальше идет код
- 70. Выделение памяти Функция malloc ничего не должна знать про конструктор и деструктор, она только выделяет память.
- 71. Выделение памяти Mine *newMine, *mine2, *mine3; newMine=new Mine; newMine->addWorker();
- 72. Выделение памяти Для вызова инициализирующих конструкторов можно использовать конструкцию указатель = new тип ( параметры );
- 73. Выделение памяти int **arr; int cnt, i, j; scanf(“%d”, cnt); arr=new int * [cnt]; for( i=0;
- 74. Освобождение памяти Функция free ничего не знает про деструктор, поэтому надо пользоваться delete. Удаление переменной delete
- 75. Освобождение памяти Внимание! Всё, что выделялось с квадратными скобками с ними же и удаляется! delete null;
- 76. Конструктор вызывается … при любом создании объекта: создании переменной (локальной или глобальной – не важно); динамическом
- 77. Деструктор вызывается … при любом уничтожении объекта: закончилось время жизни (зона видимости) переменной (локальной или глобальной
- 78. Для временных переменных … для снятия копии вызывается копирующий конструктор. Если его нет, снимается побайтовая копия
- 79. Пример class Stack {public: Stack(); ~Stack(); void push(int); int pop(); private: int *data; int count; };
- 80. Пример void func2() {Stack s; func(s); void func(Stack s) { } // почти delete &s;
- 81. Чему учит нас Летающий Макаронный Монстр? 9. Лучше бы ты не передавал объекты по значению, равно
- 82. Значит передавать по ссылке? -- Кристофер Робин, ты должен сбить шар из ружья. Ружье у тебя
- 83. Да, но только по константной void func(const Stack &st) { // Так можно int n=st.getCount(); if(
- 84. Да, но только по константной int Stack::getCount() const { count++; // нельзя return count; // можно
- 85. Переменная видна с момента ее объявления до соответствующей закрывающей скобки Область видимости переменной
- 86. int Stack::push(int d) {int i, t; int *tmp; tmp=new int[count+1]; for( i=0; i {t=data[i] tmp[i]=t; }
- 87. int Stack::push(int d) {int i; int *tmp; tmp=new int[count+1]; for( i=0; i {int t=data[i] tmp[i]=t; }
- 88. int Stack::push(int d) { int *tmp; tmp=new int[count+1]; for( int i=0; i {int t=data[i] tmp[i]=t; }
- 89. Область видимости переменной int somefunc(int **data, int cnt) {int i, sum; for( sum=0, i=0; i for(
- 90. Область видимости переменной int somefunc(int **data, int cnt) {int i, sum; for( sum=0, i=0; i for(
- 91. Лекция 3 Разработка визуальных интерфейсов в Qt
- 92. Указатель на функцию int (*pt2Function)(float, char, char); pt2Function представляет собой переменную, указывающую на начало функции, которая
- 93. Указатель на функцию int f1(float a, char b, char c) { // place your code here
- 94. Зачем это надо? int cmpMines1(const Mine &m1, const Mine &m2) {if(m1.getProduct()==m2.getProduct()) return 0; // … }
- 95. Зачем это надо? void sortMines(Mine *mines, int count, int (*cmpFunc) (const Mine &m1, const Mine &m2)
- 96. Зачем это надо? int main() { Mines mns[100]; int mCount; // Some initializations here if( sortByProd
- 97. Удобнее так typedef int (*cmpFuncType) (const Mine &m1, const Mine &m2) ); Теперь cmpFuncType – это
- 98. Удобнее так enum SortModes={smProd, smInterval, smWorkers}; class MinesCollection {// Some code here public: void setSortingMode(SortModes mode);
- 99. Удобнее так enum SortModes={smProd, smIntr, smWrk}; void MinesCollection::setSortingMode(SortModes mode) { switch( mode ) {case smProd: ptr=cmpMines1;
- 100. Для классов // Взято с http://www.newty.de/fpt/fpt.html class TMyClass { public: int DoIt(float a, char b, char
- 101. Для классов int (TMyClass::*pt2Member)(float, char, char) = null; int (TMyClass::*pt2ConstMember)(float, char, char) const = null; pt2ConstMember
- 102. Для классов TMyClass instance1; int result3 = (instance1.*pt2Member)(12, 'a', 'b'); int result4 = (*this.*pt2Member)(12, 'a', 'b');
- 103. Давайте немного попишем
- 104. Сигналы и слоты в Qt
- 105. Вы не видите ничего странного? #include class Counter : public QObject { Q_OBJECT public: Counter() {
- 106. Вы не видите ничего странного? #include class Counter : public QObject { Q_OBJECT public: Counter() {
- 107. Сигналы и слоты в Qt void Counter::setValue(int value) { if (value != m_value) { m_value =
- 108. Сигналы и слоты в Qt Counter a, b; QObject::connect(&a, &Counter::valueChanged, &b, &Counter::setValue); a.setValue(12); // a.value() ==
- 109. Сигналы и слоты в Qt Counter a, b, c, d; QObject::connect(&a, &Counter::valueChanged, &b, &Counter::setValue); QObject::connect(&a, &Counter::valueChanged,
- 110. Сигналы и слоты в Qt “+” На один сигнал можно «повесить» много слотов. Инициируя сигнал мы
- 111. Сигналы и слоты в Qt class QButton { … public slots: void clicked(); } void MainWindow::on_pushButton_13_clicked()
- 112. Дэн, ай нид хэлп
- 113. Вы не видите ничего странного? #include class Counter : public QObject { Q_OBJECT public: Counter() {
- 114. Вы не видите ничего странного? #include class Counter : public QObject { Q_OBJECT public: Counter() {
- 115. А это что? #include class Counter : public QObject { Q_OBJECT public: Counter() { m_value =
- 116. А это что? Это inline-функция. Иногда вызов функции стоит дороже самой функции. Если такую функцию оформить
- 117. Но есть нюанс Inline-функция не будет считаться компилятором таковой, если она содержит в себе операторы перехода,
- 118. Model-View-Controller Модель – хранит данные. Отображения – отображают их. Контроллеры – позволяют вводить данные. Такая модель
- 119. Спроектируем игру Железная дорога на квадратной сетке. Паровозы по рельсам возят грузы между станциями, грузы появляются
- 120. «Юный логистик» Храним карту как двумерный массив структур. Структура показывает что есть в этой ячейке: есть
- 121. «Юный логистик» Храним карту как двумерный массив структур. Структура показывает что есть в этой ячейке: есть
- 122. «Юный логистик 2.0» Карта хранит информацию о рельефе и дороге, хранит список всех зданий, знает привязку
- 123. «Юный логистик 2.1 (несколько игроков)» Надо объектам добавить информацию о их принадлежности.
- 124. «Юный логистик 2.2 (сеть)» Надо на место контроллеров добавить объект, который получает информацию из сети. На
- 125. «Юный логистик 2.3 (сеть+ИИ)» Надо добавить объект, который играет за ИИ. Информацию он будет получать как
- 126. Результаты контрольной Умеют проектировать – 24 человека (17 из С) Не умеют проектировать – 28 человек
- 127. Самые интересные ошибки class Cobe {privat int *x1, *y1, *x2, *y2, z1[MAX_INT], z2[MAX_INT]; Cobe *list, list2[6];
- 128. Самые интересные ошибки person() {int len=0; int hight=0; };
- 129. Что хотелось увидеть class Cube { Cube(); Cube(const Point &_p1, const Point &_p2, const Point &_p3);
- 130. Что хотелось увидеть class Cube; struct CubesList {Cube *cub; CubeList *next; }; class Cube {… private:
- 131. Что хотелось увидеть class Cube {… private: int id; int *neighbours; int neigh_size; };
- 132. Результаты контрольной Умеют проектировать – 14 человек Не умеют проектировать – 25 человек Не умеют программировать
- 133. Самые интересные ошибки class ClassName {privet: int x1, y1, x2, y2, r1, r2; public void interception(
- 134. Что хотелось увидеть class Circle {public: Circle(); Circle(float x, float y, float r); Circle( const Circle
- 135. Да, у них было проще Садись в ногах, правды нет.
- 136. Лекция 4 Перегрузка операторов
- 137. Некоторые классы умеют так QString str1, str2; std::ofstream fil(“file.txt”); str1=“asdfgh”; str2=“qwerty”; str1+=str2; str2=str1+”zxcvbn”; fil
- 138. Но, черт возьми, как?
- 139. Ответ Мы имеем возможность перегружать операторы + - * / % += -= *= /= %=
- 140. А как именно? Функция называется operator @ , где @ - один из перечисленных выше операторов
- 141. А как именно? MyClass& MyClass::operator += (const MyClass &obj) { a+=obj.getA(); } main() { MyClass a(1),
- 142. Но есть нюанс Некоторые операторы надо оформлять так, как надо.
- 143. Но есть нюанс MyClass & MyClass::operator = (const MyClass &obj) {// some code here return *this;
- 144. Но есть нюанс MyClass MyClass::operator + (const MyClass &obj) { MyClass tmp(*this); tmp+=obj; return tmp; }
- 145. Но есть нюанс MyClass MyClass::operator + (const MyClass &obj) { MyClass tmp(*this); tmp+=obj; return tmp; }
- 146. Но есть нюанс MyClass MyClass::operator - () // унарный минус { MyClass tmp(-a); return tmp; }
- 147. Но есть нюанс MyClass &MyClass::operator -- () // префиксный { a--; return *this; } MyClass &MyClass::operator
- 148. В итоге a += b + c - d; станет MyClass tmp1(b); tmp1 += c; MyClass
- 149. Семантика переноса MyClass MyClass::operator + (MyClass &&obj) {obj+=*this; return obj; } Только MyClass operator - (MyClass
- 150. В итоге a += b + c - d; станет MyClass tmp1(b); tmp1 += c; MyClass
- 151. Операторы вне класса // Этот код пишется вне класса MyClass operator - (const MyClass &o1, const
- 152. Операторы вне класса // Иногда надо сделать так MyClass operator - (const MyClass &o1, const MyClass
- 153. Друзья класса class myclass2; class myclass1{ friend void myfunc(myclass1 c1, myclass2 c2, int val); }; class
- 154. Друзья класса «Я такой социопат и у меня нет друзей, потому что друзья нарушают принцип инкапсуляции.»
- 155. Параметры по умолчанию C++ позволяет создавать функции, в которых часть параметров может принимать значение по умолчанию.
- 156. Параметры по умолчанию float mypaw(float x, int p=2) {float res=1; for( int i=1; i res*=x; return
- 157. Параметры по умолчанию void somef(float x, int v1=1, float v2=3.5) {// Some code. } main() {
- 158. Параметры по умолчанию НАДО НАПИСАТЬ, ЧТО В КЛАССЕ ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ ПИШЕТСЯ ТОЛЬКО В ОБЪЯВЛЕНИИ, НО
- 159. Параметры по умолчанию Запрещено иметь функции с одинаковыми названиями и отличающиеся лишь … типом параметров по
- 160. Параметры по умолчанию Это удобно когда … в большинстве случаев данная функция делает одно и тоже
- 161. Внимание, конкурс! http://samag.ru/news/more/1692 Кто наберет 150 баллов и выше, получит дополнительный балл в модуле. Кто получит
- 162. LMS работает странно Я выбираю klyshinsky.itas.miem.edu.ru Раздел «Программирование (5 семестр)»
- 163. Давайте немного попишем
- 164. Нет, не контрольная Насколько понятны лекции (1-5). Сложность семинарских занятий (1-5). Сложность лабораторных работ (1-5). Что
- 165. Результаты опроса Всё круто Всё замечательно! Всё отлично Всё на высшем уровне ЛЕКТОР БОГ ПРОГРАММИРОВАНИЯ
- 166. Результаты опроса Рассказывать помедленнее Говорить погромче Более подробно объяснять материал с более наглядными примерами. Больше полезного
- 167. Результаты опроса Интерфейсы в Qt (полный разбор конкретных задач) Публикация лекций – FIXED Больше лекций, доп.
- 168. Результаты опроса Записывать видео и выкладывать в LMS Меньше шутить С видео – всё в ваших
- 169. Результаты опроса Если Вы спрашиваете, понятно ли нам или нет, а мы молчим - тогда объясните
- 170. Результаты опроса Объяснения!!! Простите, но в аудиторию приходят не только те, кто всё знает, но и
- 171. Лекция 6 Наследование
- 172. Продолжим наши игры В игре должны быть производственные и оборонительные здания. И у тех, и у
- 173. Продолжим наши игры Если добавлять эти свойства и методы в разные классы, значит придется их копировать,
- 174. Как это делать? class First // Базовый класс. {public: int a, b; void f1(); }; class
- 175. Зачем это нужно? Несколько классов могут быть частными случаями родительского класса (как торговые, так и военные
- 176. Зачем это нужно (1)? class Unit { public: Unit(); Unit(int _x, int _y, std::string _name); ~Unit();
- 177. Зачем это нужно (1)? class TradeUnit : Unit { public: TradeUnit(); TradeUnit(int _x,int _y,std::string _name); ~TradeUnit();
- 178. Зачем это нужно (1)? class MilitaryUnit : Unit { public: MilitaryUnit(); MilitaryUnit(int _x, int _y, std::string
- 179. Интерфейс (2) class Stream { public: void operator void operator >>(int); void operator void operator >>(double);
- 180. Интерфейс (2) class NetworkStream : Stream { public: void operator void operator >>(int); void operator void
- 181. Интерфейс (2) class FileStream : Stream { public: void operator void operator >>(int); void operator void
- 182. Типичные ошибки class Point { public: void setPosition(int _x, int _y); void getPosition(int &_x, int &_y);
- 183. Типичные ошибки При проектировании структуры классов можно выделить общие фрагменты в классах и реализовать их один
- 184. Типичные ошибки class Unit { public: Unit(int _x, int _y, std::string _name); void move(); private: Point
- 185. Инициализация объектов Unit::Unit() {x=0; y=0; name=“”;} Unit::Unit(int _x, int _y, std::string _name) {x=_x; y=_y; name=_name;} MilitaryUnit::MilitaryUnit()
- 186. Инициализация объектов При вызове конструктора сперва вызываются конструкторы базовых классов и лишь после них конструктор данного
- 187. Инициализация объектов При вызове конструктора сперва вызываются конструкторы базовых классов и лишь после них конструктор данного
- 188. Инициализация объектов Unit::Unit() {x=0; y=0; name=“”;} Unit::Unit(int _x, int _y, std::string _name) {x=_x; y=_y; name=_name;} MilitaryUnit::MilitaryUnit()
- 189. Инициализация объектов MilitaryUnit mu1(10, 10, “unit1”); Превращается в mu1.Unit::Unit(){x=0; y=0; name=“”;} mu1.MilitaryUnit::MilitaryUnit(10, 10, “unit1”) { health=0;
- 190. Инициализация объектов Unit::Unit() {x=0; y=0; name=“”;} Unit::Unit(int _x, int _y, std::string _name) {x=_x; y=_y; name=_name;} MilitaryUnit::MilitaryUnit()
- 191. Зоны видимости Иногда необходимо сделать так, чтобы даже наследник не имел доступа к части данных. Для
- 192. Зоны видимости Также можно изменять вид наследования: private или public. По умолчанию – private.
- 193. Зоны видимости class MilitaryUnit : public Unit // Так правильнее { public: MilitaryUnit(); MilitaryUnit(int _x, int
- 194. Перегрузка функций void Unit::move() {// Просто юнит не передвигается! } void MilitaryUnit::move() {// Поведение войск несколько
- 195. Перегрузка функций main() { Unit unit; MilitaryUnit *munit=new MilitaryUnit; munit->move(); // Корректно перемещает юнит. unit.move(); //
- 196. Виртуальные функции Предположим, что мы создали несколько классов на основе класса Unit. Unit MilitaryUnit TradeUnit CivilUnit
- 197. Виртуальные функции class TheGame { private: // Мы ведь хотим, чтобы каждый объект вел себя //
- 198. Ах, как было бы здорово, … … если бы каждый объект знал, какого он типа, и
- 199. Есть такая партия! Это виртуальные функции. class Unit { // some code virtual void move(); //
- 200. Виртуальные функции class MilitaryUnit : public Unit { // … virtual void move(); // Будет сделана
- 201. Виртуальные функции main() { Unit unit; Chivalry *chiv=new Chivalry; chiv->move(); // Корректно перемещает юнит. unit.move(); //
- 202. Виртуальные функции class TheGame { void moveAll(); private: // Сейчас для каждого объекта будет вызываться //
- 203. Виртуальные функции void TheGame::moveAll() { for( int i=0; i allUnits[i]->move(); // Сами разберутся }
- 204. Абстрактные функции На самом деле не существует такого объекта, как Unit. Ну или не должно существовать.
- 205. Более правильное решение enum UnitKind={ukNone,ukChivalry,ukGalley /*, …*/}; class Unit { public: UnitKind getKind() { return kind;
- 206. Более правильное решение Chivalry::Chivalry() {// … kind=ukChivalry; } Galley::Galley() {// … kind=ukGalley; }
- 207. Новые возможности В 11-м стандарте С++ добавлены две новых возможности: override и final. override применяется при
- 208. Пример struct B {virtual void some_func(); virtual void f(int); virtual void g() const; }; struct D1
- 209. Пример 2 struct F final { int x, y; }; struct D : F // ошибка:
- 210. Лекция 5 Standard Template Library
- 211. Пространство имен file1.hpp int value(){ return 5;} file2.hpp const double pi=3.1416 int value(){ return 2*pi;} file3.cpp
- 212. Пространство имен file1.hpp namespace space1 { int value(){ return 5;} } file2.hpp namespace space2 { const
- 213. Пространство имен file3.cpp #include #include int i=space1::value(); // file1.hpp int j=space2::value(); // file2.hpp
- 214. Пространство имен file3.cpp #include #include using namespace space1; int i=value(); // file1.hpp using namespace space2; int
- 215. Библиотека ввода/вывода
- 216. Консольный ввод/вывод Данные классы предназначены для работы с консолью – специальными потоками данных, перенаправляемых с клавиатуры
- 217. Класс istream Форматированный ввод istream& operator>> (bool& val); istream& operator>> (short& val); istream& operator>> (unsigned short&
- 218. Класс istream Неформатированный ввод single character int get(); istream& get (char& c); c-string istream& get (char*
- 219. Класс ostream Форматированный вывод ostream& operator ostream& operator ostream& operator ostream& operator ostream& operator ostream& operator
- 220. Класс istream Неформатированный ввод single character istream& put (char& c); c-string Только
- 221. Класс istream Для программы определяются следующие потоки. cin – консольный ввод (клавиатура). cout – консольный вывод
- 222. Класс istream // istream::getline example #include // std::cin, std::cout int main () { char name[256], title[256];
- 223. Класс ifstream Конструкторы ifstream(); explicit ifstream (const char* filename, ios_base::openmode mode = ios_base::in); explicit ifstream (const
- 224. explicit Чтобы предотвратить неявные преобразования параметров, передаваемых в конструктор, можно добавить в объявление ключевое слово explicit.
- 225. explicit Заодно приводит следующий код к вызову правильного конструктора. class cl2 {cl2(int); // Нет конструктора по
- 226. Класс ifstream Режимы открытия файлов
- 227. Класс ifstream Открытие/закрытие void open (const char* filename, ios_base::openmode mode = ios_base::in); void open (const string&
- 228. Класс ifstream/ofstream Чтение двоичных данных istream& read (char* s, streamsize n); Запись двоичных данных ostream& write
- 229. Класс ifstream Позиционирование istream& seekg (streampos pos); istream& seekg (streamoff off, ios_base::seekdir way); ios_base::beg beginning of
- 230. Класс ifstream (пример) // read a file into memory #include // std::cout #include // std::ifstream int
- 231. Класс ifstream (пример) char * buffer = new char [length]; is.read (buffer,length); is.close(); std::cout.write (buffer,length); delete[]
- 232. Класс ifstream (пример) int *buffer= new char [length/sizeof(int)]; is.read ((char*)buffer,length); is.close(); … delete [] buffer; }
- 233. Сериализация объектов class Unit { UnitKind getKind() { return kind; }; virtual void write(ofstream &file)=0; virtual
- 234. Сериализация объектов class Infantry: Unit { virtual void write(ofstream &file); virtual void read(ifstream &file); virtual void
- 235. Сериализация объектов void Infantry::write(ofstream &file) { file }; // Текстовый случай void Infantry::read(ifstream &file) {char c;
- 236. Сериализация объектов void Infantry::write(ofstream &file) { file.write((char*)&shield,sizeof(float)); file.write((char*)&force,sizeof(float)); file.write((char*)&health,sizeof(float)); }; // Бинарный случай (совпадение имен!) void
- 237. Класс ifstream class UnitCollection { … void write(std::string filename); void read (std::string filename); … };
- 238. Класс ifstream … ::write(std::string filename) {std::ofstream ofile(filename); int tmp; ofile.write((char*)&ucnt, sizeof(int)); for( int i=0; i {tmp=units[i]->getKind()
- 239. Класс ifstream … ::read(std::string filename) {std::ifstream ifile(filename); int tmp; ifile.read((char*)&ucnt, sizeof(int)); units=new Unit*[ucnt]; for( int i=0;
- 240. Класс ifstream ifstream &operator >> (ifstream &file, Infantry &data) {data.read(file); return file; } ofstream &operator {data.write(file);
- 241. Класс ifstream ifstream &operator >> (ifstream &file, Infantry &data) {data.read(file); return file; } ofstream &operator {data.write(file);
- 242. Класс ifstream } // STL
- 243. Что нас ждет в конце модуля? Две лабораторные работы (1 и 2 балла соотв.): использование контейнеров
- 244. Разбор полетов, мысли В любом случае, вам необходимо больше работать самостоятельно. Это слишком сложно? http://www.youtube.com/watch?v=KkMDCCdjyW8 Самое
- 245. Разбор полетов, мысли В любом случае, вам необходимо больше работать самостоятельно. Это слишком сложно? http://www.cse.unt.edu/~rada/CSCE5290/
- 246. Перспективы Все пересдачи после зимней сессии. Если Вы не сдали как зачет, так и экзамен –
- 247. Перспективы Лабораторные работы: Сериализация (чтение/запись файлов с использованием библиотеки STL) – переделать имеющийся у вас контейнер
- 248. Перспективы Экзамен в письменной форме (5 баллов). Задания аналогичны тем, что были на зачеты, но требования
- 249. Разбор полетов, мысли
- 250. Лекция 7 Статические члены класса, обработка исключений
- 251. Что делать, если нужна глобальная переменная? Статический член класса создается в единственном экземпляре для всех объектов
- 252. Пример В программе мы динамически выделяем и освобождаем массу объектов. Но судя по всему у нас
- 253. Объявление статических переменных // ClassWithCounter.h class ClassWithCounter {public: ClassWithCounter(); ~ClassWithCounter(); private: static int cntr; };
- 254. Объявление статических переменных // ClassWithCounter.cpp int ClassWithCounter::cntr=0; ClassWithCounter::ClassWithCounter() {cntr++; } ClassWithCounter::~ClassWithCounter() {cntr--; }
- 255. Чему нас учит к.м.н. Хаус?
- 256. Объявление статической переменной Фактически при объявлении класса мы обещаем, что заведем глобальную переменную, но логически она
- 257. Кстати об инициализации // ClassWithCounter.cpp // Инициализация переменной int ClassWithCounter::cntr=0; ClassWithCounter::ClassWithCounter() {cntr=0; // Так поступать глупо.
- 258. Статические методы В отличие от переменных, статические методы, это методы, которые не обращаются к членам класса
- 259. Пример // ClassWithCounter.h class ClassWithCounter {public: ClassWithCounter(); ~ClassWithCounter(); static int getCounter(){ return cntr;} private: static int
- 260. Пример 2 class Complex {public: Complex(); Complex(double r, double i); … static Complex zero() {return Complex(0,
- 261. Пример 3 QString Static Public Members
- 262. Отслеживание ошибок Для проверки корректности данных может использоваться функция std::assert(int). Если переданное в нее значение равно
- 263. Например #include void print_number(int* myInt) {assert (myInt!=NULL); printf ("%d\n",*myInt); } int main () {int a=10, *b
- 264. Например 2 class Storage {private: int *data; //Данные int count; // И их количество public: int
- 265. Исключительные ситуации В С++ предусмотрен еще один метод обработки ошибок – обработка исключений. try { //
- 266. Исключительные ситуации Блок try содержит в себе код, порождающий исключения: деление на ноль, некорректное обращение к
- 267. Например int f1(int a) { return a/0; // }:-] Here comes Ktulhu! int f2() { return
- 268. Исключительные ситуации В круглых скобках у catch можно указать тип (в смысле типов данных) исключения. Например,
- 269. Порождение исключений Для порождения исключений используется оператор throw. throw объект или значение;
- 270. Например 2 using namespace std; int main() {try {throw range_error("The range error!"); } catch (exception &e)
- 271. Например 3 using namespace std; int main() {try {int i=random()*100; throw i; } catch (int a)
- 272. Например 4 class Trace { static int counter; int objid; public: Trace(){objid = counter++; cout if(objid
- 273. Например 4 int Trace::counter = 0; int main() { try { Trace n1; Trace array[5]; Trace
- 274. Исключительные ситуации В разных библиотеках определены собственные типы исключений. Qt – QException Builder / Delphi –
- 275. Исключительные ситуации STL В STL определены функции signal и reise. Функция reise порождает сигнал о исключении.
- 276. Например #include long prev_fact, i; void SIGhandler(int sig) {printf("\nReceived a SIGUSR1. The answer is %ld! =
- 277. Например void main(void) {long fact; printf("Factorial Computation:\n\n"); signal(SIGUSR1, SIGhandler); for(prev_fact=i=1; ;i++,prev_fact=fact) {fact = prev_fact * i;
- 278. Исключительные ситуации Не все аппаратные платформы поддерживают генерацию исключительных ситуаций. Не все ОС поддерживают генерацию и
- 279. Лекция 7 Шаблонные классы и функции
- 280. Проблема Копировать код – зло. Мне надо написать несколько функций меняющих значения двух переменных для разных
- 281. Пусть будет «Нет» и я хитр void swap(Infantry &a, Infantry &b) {Infantry tmp=a; a=b; b=tmp; }
- 282. Шаблонные функции Если имеется несколько функций, совершающих одни и те же действия для разных типов, используются
- 283. «Нет» и я образован template void swap(T &a, T &b) {T tmp=a; a=b; b=tmp; }
- 284. «Нет» и я современно образован template void swap(SwapType &a, SwapType &b) {SwapType tmp=a; a=b; b=tmp; }
- 285. «Нет» и я образован, хитер и невнимателен template void swap(T &a, T &b) {b+=a; a=b-a; b-=a;
- 286. Вызов шаблонной функции int i[5] = { 5, 4, 3, 2, 1 }; sort ( i,
- 287. Вызов шаблонной функции // Компилятор может сам определить тип. int i[5] = { 5, 4, 3,
- 288. Параметры шаблонов template void sort(T &data[size]) {for( int i=0; i for( int j=i+1; j if( data[i]
- 289. Типичные ошибки У используемого типа должны быть все члены класса и методы класса, используемые в шаблонной
- 290. Типичные ошибки Не должно возникать противоречий между типами параметров. // ошибка: параметр int[] а не char[]
- 291. Типичные ошибки Вызов шаблонной функции не должен приводить к созданию функции с тем же именем и
- 292. Несколько типов шаблонов template T1 min(T1 *data1,T2 *data2, int size2) {T1 mn=data1[data2[0]]; for( int i=1; i
- 293. Шаблонные классы template class MyContainer {public: … T operator[](int index); void sort(); … protected: T *data;
- 294. Функции шаблонных классов template void MyContainer ::sort() {…} template T MyContainer ::operator[](int index) {…}
- 295. Переменные шаблонных классов MyContainer int_coll; MyContainer unit_coll; typedef MyContainer PUnitCollect; PUnitCollect unit_coll2; MyContainer > u_c3;
- 296. Несколько типов шаблонов template T2 min(T1 &data1) {T2 mn=data1[0]; for( int i=1; i if( mn>data1[i] )
- 297. Шаблонные классы template class MyContainer { … }; template MyContainer ::grow() {T tmp=new T[count+size]; … }
- 298. Наследование от шаблонов template class MyCollection2 : public MyCollection {… };
- 299. Особенности работы с шаблонами Для каждой новой функции или класса компилятор пытается сгенерировать новый код, заменяя
- 300. Учет переменных по-новому template class Counter {public: Counter(){cnt++;} ~Counter(){cnt--;} int getCount(){return cnt;} protected: static int cnt;
- 301. Учет переменных по-новому class A {public: Counter cntr; // some other stuff. }; class B {public:
- 302. Учет переменных по-новому Так как Counter и Counter - это два разных типа, то и счетчики
- 303. Определения типов внутри шаблонного класса template class MyContainer {public: typedef T* iterator; … protected: T *data;
- 304. Параметр-шаблон template class Container > class CrossReferences { Container mems; Container refs; ... }; CrossReferences cr1;
- 305. Сложный пример template T* CreateArray( T(*GetValue)(), const int size ) { T *Array = new T[
- 306. Сложный пример int GetZero() { return 0; } char InputChar() { char c; cin >> c;
- 307. Типы как члены класса class Container {public: int array[ 15 ]; typedef int* iterator; … iterator
- 308. Типы как члены класса template void f( C& vector ) { C::iterator i = vector.begin(); //
- 309. Почему это вызывает ошибку? template void f(){T::x * p;...} Выражение T::x * p может означать две
- 310. Типы как члены класса (развитие идеи) class Container {public: int array[ size ]; typedef T* iterator;
- 311. А теперь выучим новое слово Mutable – ключевое слово означающее, что эту переменную можно менять в
- 312. Например class CFoo {int cachedValue; bool bCached; public: int calculate() const {//долгое вычисление cachedValue = ...;
- 313. Например class CFoo {mutable int cachedValue; mutable bool bCached; public: int calculate() const {if(bCached) return cachedValue;
- 314. Лекция 8 Параллельное программирование
- 315. Проблема Когда я нажимаю на кнопку, которая выполняет сложные вычисления, весь интерфейс замирает и ничего не
- 316. Откуда взялась проблема
- 317. Как мы думали оно работает Очередь сообщений ОС Цикл обработки сообщений Функция1 Функция2 ФункцияN
- 318. Как мы думали оно работает Очередь сообщений ОС Цикл обработки сообщений Функция1 Функция2 ФункцияN Генерируется сообщение
- 319. Как мы думали оно работает Очередь сообщений ОС Цикл обработки сообщений Функция1 Функция2 ФункцияN Цикл получает
- 320. Как мы думали оно работает Очередь сообщений ОС Цикл обработки сообщений Функция1 Функция2 ФункцияN Цикл получает
- 321. Как мы думали оно работает Очередь сообщений ОС Цикл обработки сообщений Функция1 Функция2 ФункцияN Функция1 отрабатывает
- 322. Как мы думали оно работает Очередь сообщений ОС Цикл обработки сообщений Функция1 Функция2 ФункцияN Приходит следующее
- 323. Откуда взялась проблема Очередь сообщений ОС Цикл обработки сообщений Функция1 Функция2 ФункцияN
- 324. Откуда взялась проблема Очередь сообщений ОС Цикл обработки сообщений Функция1 Функция2 ФункцияN Генерируется сообщение
- 325. Откуда взялась проблема Очередь сообщений ОС Цикл обработки сообщений Функция1 Функция2 ФункцияN Цикл получает сообщение и
- 326. Откуда взялась проблема Очередь сообщений ОС Цикл обработки сообщений Функция1 Функция2 ФункцияN Цикл получает сообщение и
- 327. Откуда взялась проблема Очередь сообщений ОС Цикл обработки сообщений Функция1 Функция2 ФункцияN Приходит новое сообщение, цикл
- 328. Откуда взялась проблема Очередь сообщений ОС Цикл обработки сообщений Функция1 Функция2 ФункцияN Цикл занят, так как
- 329. Решение Очередь сообщений ОС Цикл обработки сообщений Функция1 Функция2 ФункцияN Поток 1 Поток 2 Поток 3
- 330. Решение (на самом деле) Очередь сообщений ОС Цикл обработки сообщений (ЦОС) Функция1 Функция2 ФункцияN Поток 1
- 331. Решение Очередь сообщений ОС Цикл обработки сообщений Функция1 Функция2 ФункцияN Поток 1 Поток 2 Поток 3
- 332. Решение Очередь сообщений ОС Цикл обработки сообщений Функция1 Функция2 ФункцияN Поток 1 Поток 2 Поток 3
- 333. Решение Очередь сообщений ОС Цикл обработки сообщений Функция1 Функция2 ФункцияN Поток 1 Поток 2 Поток 3
- 334. Решение Очередь сообщений ОС Цикл обработки сообщений Функция1 Функция2 ФункцияN Поток 1 Поток 2 Поток 3
- 335. Решение Очередь сообщений ОС Цикл обработки сообщений Функция1 Функция2 ФункцияN Поток 1 Поток 2 Поток 3
- 336. Решение Очередь сообщений ОС Цикл обработки сообщений Функция1 Функция2 ФункцияN Поток 1 Поток 2 Поток 3
- 337. Что для этого есть в Qt? class WorkerThread : public QThread {Q_OBJECT void run() Q_DECL_OVERRIDE {
- 338. Почему это плохо? class WorkerThread : public QThread // Наследование лучше оставить для // расширения возможностей
- 339. Класс QThread public: void exit(int returnCode = 0); // Tells the thread's event loop to exit
- 340. Класс QThread public slots: void quit(); void start(); void terminate(); signals: void finished(); void started(); void
- 341. Как сделать лучше class Worker {public slots: void doWork(); }; void MainWindow::on_pushButton_clicked() {QThread *thread = new
- 342. Как сделать еще лучше class Worker {public: QThread *thrd; public slots: void doWork(); void stop(){thrd->quit();delete thrd;}
- 343. Как сделать еще лучше Worker *worker=NULL; void MainWindow::on_pushButton_clicked() {QThread *thread = new QThread; worker = new
- 344. Как сделать еще лучше void MainWindow::on_pushButton2_clicked() { if( worker ) {worker->stop(); delete worker; worker=NULL; } }
- 345. Возможные проблемы Одновременное обращение к одной и той же ячейке памяти (независимо на чтение или запись)
- 346. Мьютексы Операционная система позволяет проводить синхронизацию работы различных потоков при помощи специальных структур данных, например, мьютексов.
- 347. QMutex public: void lock(); bool tryLock(); bool tryLock(int timeout); void unlock();
- 348. Например Поток1 Поток2 ПотокN Результаты
- 349. QMutex ResType *lst=NULL; int resCount=0; QMutex locker; void produceResults() {locker.lock() ResType *tmp=new ResType[resCount+1]; for(int i=0;i tmp[resCount]=myres;
- 350. Например ПОТОК 1 produceResults() {locker.lock() new for(…); tmp[]=myres; изменения; locker.unlock(); }
- 351. Например ПОТОК 1 produceResults() {locker.lock() new for(…); tmp[]=myres; изменения; locker.unlock(); }
- 352. Например ПОТОК 1 produceResults() {locker.lock() new for(…); tmp[]=myres; изменения; locker.unlock(); }
- 353. Например ПОТОК 1 produceResults() {locker.lock() new for(…); tmp[]=myres; изменения; locker.unlock(); } ПОТОК 2 produceResults() {locker.lock() new
- 354. Например ПОТОК 1 produceResults() {locker.lock() new for(…); tmp[]=myres; изменения; locker.unlock(); } ПОТОК 2 produceResults() {locker.lock() new
- 355. Например ПОТОК 1 produceResults() {locker.lock() new for(…); tmp[]=myres; изменения; locker.unlock(); } ПОТОК 2 produceResults() {locker.lock() new
- 356. Например ПОТОК 1 produceResults() {locker.lock() new for(…); tmp[]=myres; изменения; locker.unlock(); } ПОТОК 2 produceResults() {locker.lock() new
- 357. Например ПОТОК 1 produceResults() {locker.lock() new for(…); tmp[]=myres; изменения; locker.unlock(); } ПОТОК 2 produceResults() {locker.lock() new
- 358. Например ПОТОК 1 produceResults() {locker.lock() new for(…); tmp[]=myres; изменения; locker.unlock(); } ПОТОК 2 produceResults() {locker.lock() new
- 359. QSemaphore В отличие от мьютекса обладает несколькими ресурсами и переводится в заблокированное состояние лишь когда будут
- 360. QSemaphore public: QSemaphore(int n=0); void acquire(int n=1); void release(int n=1); bool tryAcquire(int n=1); bool tryAcquire(int n=1,
- 361. QSemaphore ResType lst[100]; int resCount=0; QSemaphore locker(100); void produceResults() {locker.acquire(n) for( int i=0; i lst[resCount++]=myres[i]; }
- 362. Например Поток1 Поток2 ПотокN Результаты ПотокN+1
- 363. Например Поток1 Поток2 ПотокN Результаты ПотокN+1
- 364. Например Поток1 Поток2 ПотокN Результаты ПотокN+1
- 365. Например Поток1 Поток2 ПотокN Результаты ПотокN+1
- 366. Например Поток1 Поток2 ПотокN Результаты ПотокN+1
- 367. Например Поток1 Поток2 ПотокN Результаты ПотокN+1
- 368. Например Поток1 Поток2 ПотокN Результаты ПотокN+1
- 369. Например Поток1 Поток2 ПотокN Результаты ПотокN+1
- 371. Скачать презентацию