- •Фролов а.В., Фролов г.В. Библиотека системного программиста
- •Программирование для Windows 95 и Windows nt Введение
- •Поддержка сети Internet
- •Язык моделирования виртуальной реальности
- •Игровое sdk
- •Набор ocx объектов
- •Как связаться с авторами
- •Благодарности
- •Ввод/вывод
- •Константы
- •Распределение памяти
- •Операторы new и delete
- •Перегрузка имен функций
- •Задание параметров функции по умолчанию
- •Встраивание
- •Ключевое слово this
- •Разграничение доступа к элементам класса
- •Методы, входящие в класс
- •Конструкторы и деструкторы класса
- •Методы, не изменяющие объекты класса
- •Статические методы
- •Общие члены объектов класса
- •Дружественные функции и дружественные классы
- •Дружественные функции
- •Дружественные классы
- •Наследование
- •Единичное наследование
- •Множественное наследование
- •Разграничение доступа к элементам базового класса
- •Переопределение методов базового класса
- •Виртуальные методы
- •Абстрактные классы
- •Структуры
- •Шаблоны
- •Шаблоны в mfc
- •Перегрузка операторов
- •Обработка исключительных ситуаций
- •Операторы try, throw и catch
- •Листинг 1.1. Файл Exception.Cpp
- •Универсальный обработчик исключений
- •Тип исключения
- •2. Введение в mfc
- •Классы библиотеки mfc
- •Самый базовый класс mfc (класс cObject)
- •Основа структуры приложения (класс cCmdTarget)
- •Подзадачи приложения (классы cWinThread и cWinApp)
- •Документ приложения (класс cDocument)
- •Шаблон документов (классы cDocTemplate, cSingleDocTemplate и cMultiDocTemplate)
- •Окна (класс cWnd)
- •Исключения (класс cException)
- •Массивы, списки и словари
- •Файловая система (класс cFile)
- •Контекст отображения (класс cdc)
- •Объекты графического интерфейса (класс cGdiObject)
- •Меню (класс cMenu)
- •Базы данных (классы для работы с базами данных)
- •Синхронизация задач приложения (класс cSyncObject)
- •Сокеты (классы cAsyncSocket и cSocket)
- •Классы, не имеющие базового класса
- •Простые классы
- •Архивный класс (класс cArchive)
- •Информация о классе объекта (структура cRuntimeClass)
- •Отладка приложения (классы cDumpContext, cMemoryState)
- •Печать документа (класс cPrintInfo)
- •Первое приложение mfc
- •Окно Project Workspace
- •Листинг 2.1. Файл mfHello.Cpp
- •Средства ClassView
- •Добавление к классу нового метода
- •Добавление к классу нового элемента данных
- •Просмотр дерева наследования классов
- •Редактирование методов класса
- •Редактирование элементов данных класса
- •Приложение с единственным окном
- •Листинг 2.2. Файл mfStart.Cpp
- •Листинг 2.3. Файл mfStartApp.H
- •Оконные сообщения
- •Сообщения от органов управления
- •Командные сообщения
- •Макрокоманда on_registered_message
- •Макрокоманда on_message
- •Макрокоманда on_command
- •Макрокоманда on_command_range
- •Макрокоманда on_update_command_ui
- •Макрокоманда on_update_command_ui_range
- •Макрокоманда on_control_range
- •Забегая вперед
- •Приложение mfMenu
- •Листинг 2.7. Файл mfMenu.Cpp
- •Ресурсы приложения
- •Создание меню для приложения mfMenu
- •Листинг 2.8. Файл mfMenuRes.H
- •Листинг 2.9. Файл mfMenuRes.Rc
- •Долгий путь сообщения
- •Листинг 2.10. Файл mfMessage.Cpp
- •Листинг 2.11. Фрагмент файла mfMessage.Rc
- •Листинг 2.12. Файл resource.H
- •Диалоговая панель
- •Приложение с модальной диалоговой панелью
- •Листинг 2.13. Файл mfDialog.Cpp
- •Vertical Scroll Bar Вертикальная полоса просмотра
- •Листинг 2.14. Фрагмент файла mfDlgRes.Rc
- •Листинг 2.15. Файл resource.H
- •Главный класс приложения
- •Класс диалоговой панели
- •Обмен данными
- •Приложение с немодальной диалоговой панелью
- •3. Некоторые классы mfc
- •Класс cObject – основной класс mfc
- •Конструкторы класса
- •Оператор присваивания
- •Диагностика
- •Проверка целостности объектов класса
- •Получение дампа объекта класса
- •Сохранение и восстановление состояния объекта
- •Метод IsSerializable
- •Виртуальный метод Serialize
- •Информация о классе
- •Виртуальный метод GetRuntimeClass
- •Метод IsKindOf
- •Класс cPoint – точка на плоскости
- •Класс cSize – относительные координаты
- •Класс cString – текстовые строки
- •Конструктор класса
- •Коллекции
- •Массивы – шаблон cArray
- •Списки – шаблон cList
- •Словари – шаблон cMap
- •Класс cTime – дата и время
- •Файловая система – класс cFile
- •Открытие и создание файлов
- •Идентификатор открытого файла
- •Закрытие файлов
- •Чтение и запись файлов
- •Метод Flush
- •Операции с файлами
- •Блокировка
- •Позиционирование
- •Характеристики открытого файла
- •Файловая система – классы cMemFile и cStdioFile
- •Модификация класса cMemFile
- •Файловая система – класс cStdioFile
- •Приложение TestFile
- •Листинг 3.1. Файл TestFile.Cpp
- •Листинг 3.2. Файл fsystem.Dat
- •Исключения – класс cException
- •Класс cException
- •Класс cMemoryException
- •Класс cFileException
- •Приложение Except
- •Листинг 3.3. Файл Except.Cpp
- •Класс cArchiveException
- •Класс cNotSupportedException
- •Класс cResourceException
- •Класс cUserException
- •Запись и восстановление объектов
- •Запись в архивный файл
- •Чтение из архивного файла
- •Многозадачные приложения
- •4. Приложение с главной диалоговой панелью
- •Создание приложения средствами mfc AppWizard
- •Приложение Dialog
- •Имена, используемые mfc
- •Ресурсы приложения
- •Icons Пиктограммы
- •Version information Сведения о версии приложения
- •Диалоговые панели приложения Dialog
- •Пиктограмма
- •Исходные тексты приложения
- •Главный класс приложения dialog
- •Листинг 4.1. Файл Dialog.H
- •Листинг 4.2. Файл Dialog.Cpp
- •Главный объект приложения
- •Метод InitInstance
- •Класс главной диалоговой панели приложения
- •Листинг 4.3. Файл DialogDlg.H
- •Листинг 4.4. Файл DialogDlg.Cpp
- •Конструктор класса cDialogDlg
- •Метод DoDataExchange
- •Метод OnInitDialog
- •Метод OnSysCommand (системное меню)
- •Метод OnPaint (отображение пиктограммы приложения)
- •Метод OnQueryDragIcon
- •Файлы StdAfx.Cpp и StdAfx.H
- •Листинг 4.5. Файл StdAfx.Cpp
- •Листинг 4.6. Файл StdAfx.H
- •Средства ClassWizard
- •Создание нового класса
- •Листинг 4.7. Файл NewClass.H
- •Листинг 4.8. Файл NewClass.Cpp
- •Включение в класс новых методов
- •Включение в класс новых элементов данных
- •Просмотр характеристик класса
- •5. Однооконный интерфейс
- •Модель “документ – окно просмотра ”
- •Процедура создания однооконного приложения
- •Приложение Single
- •Ресурсы приложения
- •Шаблон меню
- •Панель управления toolbar
- •Пиктограмма
- •Диалоговая панель
- •Общие замечания о ресурсах приложения
- •Классы приложения
- •Класс cSingleApp
- •Главный объект приложения
- •Конструктор класса cSingleApp
- •Метод InitInstance
- •Метод OnAppAbout
- •Класс cSingleDoc
- •Конструктор и деструктор класса cSingleDoc
- •Методы OnNewDocument и Serialize
- •Методы AssertValid и Dump
- •Класс cSingleView
- •Конструктор и деструктор класса cSingleView
- •Метод GetDocument
- •Метод PreCreateWindow
- •Метод OnDraw
- •Методы OnPreparePrinting, OnBeginPrinting и OnEndPrinting
- •Методы AssertValid и Dump
- •Класс cMainFrame
- •Конструктор и деструктор класса cMainFrame
- •Метод OnCreate
- •Панель управления и панель состояния
- •Панель управления
- •Панель состояния
- •Метод PreCreateWindow
- •Методы AssertValid и Dump
- •Обработка командных сообщений
- •Порядок обработки сообщений
- •Главное окно однооконного приложения
- •Окно просмотра
- •Документ
- •Диалоговая панель
- •Командные сообщения и приложение Single
- •Изменение порядка обработки сообщений
- •Стандартные команд ные сообщения
- •Командные сообщения с идентификаторами id_file_
- •Командные сообщения с идентификаторами id_edit_
- •Командные сообщения с идентификаторами id_window_
- •Командные сообщения с идентификаторами id_app_
- •Командные сообщения с идентификаторами id_help_
- •Командные сообщения с идентификаторами id_view_
- •Простейший графический редактор
- •Создание нового документа
- •Сохранение и восстановление документа на диске
- •Для забывчивых пользователей
- •Простейший текстовый редактор
- •Заключение
- •Литература
Дружественные классы
По аналогии с дружественными функциями и методами, можно объявить дружественный класс. Все методы дружественного класса, могут обращаться ко всем элементам класса, включая элементы, объявленные как private и protect.
Так, например, в предыдущем примере вы могли бы определить, что класс point является дружественным классу line. Все методы класса point могут обращаться к любым элемента класса line.
//==========================================================
// Класс point
class point {
// …
};
//==========================================================
// Класс line
class line {
public:
// Класс point объявляется дружественным классу line
friend class point;
};
Наследование
Пожалуй, самая важная возможность, предоставляемая программисту средствами языка Си++, заключается в механизме наследования. Вы можете наследовать от определенных ранее классов новые производные классы. Класс, от которого происходит наследование, называется базовым. Новый класс называется производным.
Производный класс включает в себя элементы базового класса и может дополнять их собственными элементами данных и методами. За счет наследования появляется возможность повторного использования кода программы.
Производный класс сам может служить базовым классом. Вы можете наследовать от него другие классы. Полученный в результате такого наследования класс будет включать в себя элементы всех его базовых классов.
От одного общего базового класса можно наследовать несколько новых производных классов. Производный класс сам может служить базовым классом для новых классов. Таким образом возможна древовидная структура наследования классов.
На рисунке 1.1 мы привели пример структуры наследования классов. От единственного базового класса BaseClass наследуются три класса DerivedClassOne, DerivedClassSecond и DerivedClassThird. Первые два из них сами выступают в качестве базовых классов.
Рис. 1.1. Наследование
Практически вся структура библиотеки классов MFC основывается на механизме наследования. Так, например, большинство классов MFC имеет базовый класс CObject, который обеспечивает наиболее общие свойства унаследованных от него классов.
Можно выделить две основных формы наследования. Когда производный класс наследуется от единственного базового класса – единичное наследование. Наследование, при котором производный класс наследуется сразу от нескольких базовых классов – это множественное наследование .
Единичное наследование
В случае единичного наследования порожденный класс наследуется только от одного базового класса. Рисунок 1.1 отражает единичное наследование классов. Единичное наследование является наиболее распространенным методом наследования. Библиотека классов MFC использует только единичное наследование.
Чтобы указать, что класс наследуется от другого базового класса, имя базового класса <base> необходимо указать после имени класса перед открывающей фигурной скобкой определения класса. Непосредственно перед именем базового класса необходимо поставить знак двоеточия:
class [<tag>[:<base>]]
{
<member-list>
} [<declarators>];
Перед названием базового класса может быть указан спецификатор доступа public, private или protect. Назначение этих спецификаторов мы рассмотрим в разделе “Разграничение доступа к элементам базового класса”. Сейчас же мы скажем только, что если вы не укажите спецификатор доступа, то по умолчанию будет подразумеваться спецификатор private.
Ниже мы определили базовый класс Base, содержащий несколько элементов, а затем наследовали от него два новых класса DerivedFirst и DerivedSecond. В каждом из порожденных классов мы определили различные дополнительные методы и элементы данных.
// Класс Base
class Base {
// Элементы класса Base
};
// Класс DerivedFirst, наследованный от базового класса Base
class DerivedFirst : Base {
// Элементы класса DerivedFirst
};
// Класс DerivedSecond, наследованный от базового класса Base
class DerivedSecond : Base {
// Элементы класса DerivedSecond
};
Классы DerivedFirst и DerivedSecond сами могут выступать в качестве базовых классов.
Вы можете определять в пороженном классе элементы, имена которых совпадают с именами элементов базовых классов. Если вы выполнили такое переопределение, вы можете обратиться к элементу базового класса, если укажете его полное имя. Полное имя должно состоять из имени класса, к которому относится элемент, оператора :: и имени самого элемента.
В качестве примера приведем базовый класс Base и производный от него класс Derived. В обоих классах определен элемент данных iNumber. Чтобы получить доступ из порожденного класса к элементу iNumber базового класса указывается его полное имя Base::iNumber.
// Класс Base
class Base {
public:
int iNumber;
// Другие элементы класса
};
// Класс Derived, наследованный от базового класса Base
class Derived : Base {
public:
// Это объявление скрывает элемент iNumber базового класса
int iNumber;
int GetNumber(void) { return iNumber + Base::iNumber; }
};
Указатель на объект базового класса можно присвоить указатель на объект класса порожденного от него. Эта возможность будет широко использоваться в библиотеке классов MFC.