CppCourse
Introductory C++ course with a bit of advanced stuff
Install / Use
/learn @ar1st0crat/CppCourseREADME
Объектно-ориентированное программирование на С++
Вводный курс по C++ и ООП со вкраплениями нетривиальных вещей
План:
- Тема 0 - Введение
- Тема 1 - Работа с памятью
- Тема 2 - Классы и объекты. Инкапсуляция
- Тема 3 - Перегрузка операторов
- Тема 4 - Наследование
- Тема 5 - Полиморфизм. Абстрактные классы и интерфейсы
- Тема 6 - RTTI, dynamic_cast
- Тема 7 - Агрегация/Композиция vs. Наследование vs. Дружественность
- Тема 8 - Исключения
- Тема 9 - Шаблонные функции и классы. SFINAE
- Тема 10 - Библиотека STL
- Тема 11 - RAII. Умные указатели
- Тема 12 - Современные стандарты С++
- Тема 13 - Qt
- Тема 14 - Win32 API, MFC
Темы и вопросы курса поясняются на примерах классов и интерфейсов проекта TaxiService. В лекциях потихоньку будет писаться эта система (впрочем, будет обозначен только каркас).
Данный проект можно рассматривать как "учебный стенд" с одним слоем упрощенной бизнес-логики для демонстрации основ ООП. Более продвинутые техники ООП рассматриваются в других курсах и на факультативных занятиях
Предметная область (domain) - служба такси.
Кратко:
- КЛИЕНТ заказывает такси по телефону (СИСТЕМА добавляет информацию по КЛИЕНТУ, если он обращается впервые)
- ОПЕРАТОР принимает звонок и формирует ЗАКАЗ, включая в него пожелания КЛИЕНТА (в виде ответов на определенный набор вопросов), пункт отправки и пункт назначения
- СИСТЕМА анализирует данные предзаказа от ОПЕРАТОРА, находит подходящего ВОДИТЕЛЯ и МАШИНУ, окончательно формирует ЗАКАЗ и отсылает смс КЛИЕНТУ с номером заказа и информацией
- ВОДИТЕЛЬ может отменить ЗАКАЗ (если КЛИЕНТ не явился); если КЛИЕНТ дважды игнорировал заказ, он добавляется в черный список
- СИСТЕМА учитывает рейтинг ВОДИТЕЛЯ и данные об активности КЛИЕНТА
- ОПЕРАТОР и ВОДИТЕЛЬ числятся сотрудниками службы, им начисляется зарплата по разным правилам
- СИСТЕМА хранит (и может отображать) информацию о всех ВОДИТЕЛЯХ, МАШИНАХ, ЗАКАЗАХ, КЛИЕНТАХ, ОПЕРАТОРАХ
- СИСТЕМА располагает некоторой ГЕОСЛУЖБОЙ, позволяющей конвертировать адрес объекта в геокоординаты и обратно, рассчитывать расстояние между объектами города, а также оптимальный маршрут (вы думаете, что будет код этого действа? наииивные... ))).
+
Демо-проект "Консольный блекджек" с дополнительными элементами:
- с++14 (auto, unique_ptr, shared_ptr, move, lambdas)
- автодокументация кода с doxygen
- юнит-тесты google test
- интеграционные тесты google mock
- директивы препроцессора
- файлы makefile
В репозитории хранится несколько релизных версий:
Вариант "Студенческий середнячок": модульная объектно-ориентированная декомпозиция, пара интерфейсов, обработка исключений, кое-какие возможности С++ новых стандартов, добавлены простейшие юнит-тесты.
Предыдущий вариант, но с добавлением умных указателей. Обязательно ознакомиться со статьей Эрба Саттера: GOTW #91 для понимания принципов ведения и передачи умных указателей в качестве параметров.
Более-менее взрослый вариант: архитектура MVP, паттерны State и Strategy, проект достаточно тестируемый и расширяемый, добавлены интеграционные тесты, некоторые решения относительно кода были приняты после написания тестов (TDD).
Ресурсы
UML-диаграммы рисованы в крутом и удобном онлайн-редакторе yuml.me
Книги по основам С++:
- Роберт Лафоре "Объектно-ориентированное программирования в С++"
- Стивен Прата "Язык программирования С++. Лекции и упражнения"
- Бйорн Страуструп "Язык программирования С++"
Более продвинутые:
- книги Скотта Майерса (все)
- книги Эрба Саттера (все)
- Андрей Александреску "Современное проектирование на С++. Обобщенное программирование и прикладные шаблоны программирования"
Related Skills
node-connect
347.2kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
108.0kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
347.2kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
qqbot-media
347.2kQQBot 富媒体收发能力。使用 <qqmedia> 标签,系统根据文件扩展名自动识别类型(图片/语音/视频/文件)。
