Рассмотрим конкретную задачу – адресную книгу.
Часть 1
Это пример на работу со стандартной библиотекой Си++.
Формат файла книги построчный, в каждой строке:
имя ; почта ; телефон
Имя должно присутствовать. Если нет почты, но есть телефон, то должны быть обе точки с запятой.
Строки могут быть пустыми (пробельными).
Часть 2
Это пример на взаимодействие объектов классов.
Обратите внимание на то, что общение с пользователем (Dialog и Command) и с файлом (AddressBook::File) отделены от обработки данных (AddressBook).
Также показаны шаблоны проектирования "Одиночка" (класс Dialog), "Фабричный метод" (Command::create) (можно было создать свою фабрику для каждой команды и сделать create виртуальной, но здесь это усложнение не оправдано).
Шаблон "Команда" используется частично (Command), полностью его потенциал не реализован, в частности нет отмены действий. Но добавить отмену в данную программу уже существенно проще, чем в предыдущий пример.
Данный пример использует умный указатель std::unique_ptr из Си++11. В GCC нужно указать стандарт, например:
g++ -std=c++11 *.cpp
В Visual Studio 2010 и выше данный класс реализован, компилируется как консольное приложение без дополнительных настроек.
Часть 3
Это пример на создание оконного интерфейса с помощью Qt.
Обратите внимание на то, что классы, работающие с данными (AddressBook и AddressBook::File), никак не изменились с предыдущего примера. Заменён лишь пользовательский интерфейс с терминала на окна.
Часть 4
Пример 1. Классы данных (AddressBook и AddressBook::File) переписаны под Qt с минимальными изменениями.
Пример 2. Формат файла переведён на XML.
Если используются классы из модуля QtXml (например, QDomDocument), его нужно подключать в файле проекта (см. pro-файл).
Если работаете с QXmlStreamWriter/Reader, дополнительные модули Qt не нужны, это QtCore.
Пример 3.
Несколько переработана архитектура приложения. Появился свой класс приложения, который связывает данные и интерфейс (выполняя роль "контроллера" в шаблоне"модель-вид-контроллер"). Сигналы и слоты используются чаще (например, для оповещения окна об изменении данных). Исправлены некоторые ошибки.
Наследование проиллюстрировано ещё раз: теперь приложение умеет сохранять данные как обычном текстовом формате, так и в XML, класс файла сам выбирает свою реализацию по имени файла.
Изменились почти все файлы проекта.