- •Л. Б. Бузюков, о. Б. Петрова
- •Учебное пособие
- •Предисловие
- •Глава 1. Введение в язык с
- •1.1. История создания и особенности языка с
- •1.3. Элементы языка с
- •1.3.1. Основные символы
- •1.3.2. Ключевые слова
- •1.3.3. Идентификаторы
- •1.3.4. Константы
- •1.3.5. Лексемы
- •1.3.6. Комментарии
- •Глава 2. Типы данных языка c
- •2.1. Числовые типы данных
- •2.2. Объявление переменных
- •2.3. Данные целого типа
- •2.4. Данные вещественного типа
- •Глава 3. Выражения
- •3.1. Операции
- •3.1.1. Арифметические операции
- •3.1.2. Операция присваивания
- •Глава 4. Составление простейших программ
- •4.1. Препроцессор и его функции
- •4.2. Основные директивы препроцессора
- •4.2.1. Директива include
- •4.2.2. Директива define
- •4.2.3. Директива undef
- •4.3. Структура и правила составления программ
- •4.3.1. Структура функции
- •4.3.2. Функция main()
- •4.3.3. Структура простой программы
- •4.3.4. Правила записи объявлений, операторов и комментариев
- •4.3.5. Пример простейшей программы
- •Глава 5. Средства ввода/вывода
- •5.1. Общие замечания
- •5.2. Функция форматированного вывода printf()
- •5.2.1. Основные форматы
- •5.2.2. Модификации форматов
- •5.3. Функция форматированного ввода scanf()
- •Глава 6. Управляющие операторы
- •6.1. Условные операторы
- •6.1.1. Логические выражения
- •6.1.2. Формы оператора if
- •6.1.3. Оператор выбора switch
- •6.2. Операторы цикла
- •6.2.1. Оператор while
- •6.2.2. Оператор for
- •6.2.3. Оператор do-while
- •6.3. Операторы перехода
- •6.3.1. Оператор break
- •6.3.2. Оператор continue
- •6.3.3. Оператор return
- •6.3.4. Применение оператора goto и меток
- •Глава 7. Функции
- •7.1. Основные понятия
- •7.2. Определение функции
- •7.3. Прототип функции
- •7.4. Вызов функции
- •Глава 8. Классы памяти
- •8.1. Логическаяструктура памяти программы
- •8.2. Особенности классов памяти
- •8.3. Объявления переменных
- •8.4. Объявления функций
- •8.5. Время жизни и область видимости программных объектов
- •8.6. Инициализация глобальных и локальных переменных
- •Глава 9. Указатели
- •9.1. Операция получения адреса
- •9.2. Операции над указателями
- •Глава 10. Массивы
- •10.1. Общие сведения о массивах
- •10.2. Одномерные массивы
- •10.3. Двумерные массивы
- •10.4. Массивы и указатели
- •10.5. Массивы и функции
- •Глава 11. Строки
- •11.1. Представление символьной строки при помощи одномерного массива
- •11.2. Указатель на символьную строку
- •11.3. Ввод/вывод символьных строк
- •11.4. Массивы символьных строк
- •11.5. Функции работы состроками
- •Глава 12. Структуры
- •12.1. Определение структуры
- •12.2. Структуры и функции
- •12.3. Указатели на структуру
- •12.4. Массивы структур
- •12.5. Вложенные структуры
- •12.6. Использование синонима типа
- •12.7. Объединения
- •Глава 13. Файлы
- •13.1. Работа с файлами
- •13.2. Функции ввода/вывода
- •Глава 14. Динамическая память
- •14.1. Распределение памяти
- •14.2. Функции управление памятью
- •Глава 15. Проект
- •15.1. Основы создания проекта
- •15.2. Пример создания проекта
- •Глава 17. Основы объектно-ориентированного программирования
- •17.1. Объектно-ориентированный подход
- •17.3. Конструкторы и деструкторы
- •17.4. Инкапсуляция
- •17.5. Полиморфизм
- •17.6. Наследование
- •17.7. Виды взаимодействия классов
- •17.8. Способы графического представления объектно-ориентированной задачи
- •18.2. Библиотека Win32 api
- •18.3. Библиотека owl
- •18.4. Библиотека vcl
- •18.5. Библиотека clx
- •18.6. Библиотека mfc
- •18.7. Библиотека OpenGl
- •19.3. Создание проекта
- •19.4. Редактирование проекта
- •19.5. Компиляция и выполнение программы
- •19.6. Файловая структура проекта
- •19.7. Создание консольного приложения
- •Глава 20. Разработка приложений для операционных систем windows
- •20.1. Взаимодействие программы и Windows
- •20.2. Компоненты библиотеки Win32 api
- •20.3.Функция WinMain()
- •20.4. Оконная процедура
- •20.5. Структура программы для ос Windows
- •20.6. Ресурсы Windows
- •20.7. Взаимодействие прикладной программы и устройств в Windows
- •Глава 21. Создание приложений для ос windows на основе библиотеки mfc
- •21.1. Обзор классов библиотеки mfc
- •21.2. Класс cString
- •21.3. Класс cFile
- •21.4. Класс cPoint
- •21.5. Класс cRect
- •21.7. Приложение, основанное на диалоге
- •21.8. Использование в приложении элементов управления
- •21.9. Мастер классов mfc ClassWizard
- •21.10. Установка начального значения элементам управления
- •21.11. Элементы управления Picture
- •21.12. Элемент управления Group Box
- •21.13. Элемент управления Radio Button
- •21.14. Элемент управления Check Box
- •21.15. Элемент управления List Box
- •21.16. Создание меню
- •21.17. Приложение с двумя диалоговыми панелями
- •21.18. Приложение sdi
- •21.19. Создание панели инструментов
- •21.20. Приложение mdi
- •21.21. Контекстыустройств в mfc
- •21.22. Графические объекты Windows в mfc
- •21.23. Графические операции в mfc
- •П.1. Основы методологии конструирования программ
- •П.1.1. Основные понятия. Программа и алгоритм
- •П.1.2. Этапы разработки программ
- •П.2. Алгоритмы
- •П.2.1. Алгоритм и его свойства
- •П.2.2. Способы описания алгоритмов
- •П.2.3. Средства графического изображения алгоритмов Схемы алгоритмов
- •Псевдокоды
- •Структурограммы
- •П.3. Основные приемы программирования
- •П.3.1. Разновидности структур программирования
- •П.3.2. Программирование линейных и разветвляющихся процессов
- •П.3.3. Программирование циклических процессов
- •Арифметический цикл (цикл с параметром)
- •Итерационный цикл
- •Вложенный цикл
- •Литература
17.7. Виды взаимодействия классов
На этапе создания объектной модели задачи необходимо выявить как сами объекты, так и связи между ними, которые следует учитывать при конструировании классов.
Можно выделить четыре вида взаимодействия классов:
наследование,
агрегация (включение),
использование,
ассоциация.
Объектную модель задачи удобно представлять графически в виде набора диаграмм, иллюстрирующих задачу с разных сторон. Один из видов диаграмм – диаграмма классов.
Рис. 17.2. Обозначение класса на диаграммах:а – подробное, б – упрощенное
Базовый элемент таких диаграмм – класс – изображается в виде прямоугольника, разделенного на три ячейки: в верхнюю помещается название класса, в среднюю – свойства, в нижнюю – методы. На рис. 17.2, а представлено графическое изображение класса Printer. Допускается также упрощенное обозначение класса (рис. 17.2, б) на диаграммах: указывается только название класса без перечисления его свойств и методов.
Связи между классами обозначаются прямыми линиями. Для каждого вида взаимодействия используются определенные типы линий (рис. 17.3).
Рассмотрим виды взаимодействия классов.
Наследование, т. е. создание нового класса на базе существующего, рассмотрено выше. Класс-наследник также может иметь наследников, его наследники, в свою очередь, также могут иметь наследников, и так далее, в результате может быть выстроена иерархическая структура – дерево классов. Основу любой библиотеки классов (объектов), объектной модели программы, например, браузера, составляет иерархия классов. Пример графического представления наследования приведен на рис. 17.4.
Рис. 17.3. Обозначения вызовов взаимодействия классов
Рис. 17.4. Диаграмма наследования
Агрегация – включение объектов одного класса в состав другого класса; cвязь однонаправленная (рис. 17.5).
Код программы, отражающий агрегацию классов, следующий:
class A
{ …
void met_A();
…
}
class B
{ …
A b1; //В состав класса B включен объект класса A
…
}
Рис. 17.5. Диаграмма агрегации классов
Включенный объект b1 не существует самостоятельно, он создается внутри объекта класса B. Доступ к включенному во внешний класс объекту осуществляется только через объект внешнего класса:
B objB;
objB.b1.met_A();
Использование или клиент-серверное взаимодействие – это однонаправленная связь двух самостоятельных объектов, один из которых (сервер) предоставляет свои услуги другому (клиенту). Клиент-серверное взаимодействие (рис. 17.6) осуществляется через использование в методах клиента обращения к объекту-серверу.
Если класс A выступает в роли сервера, а класс B – клиента, то объект класса A передается в методы класса B в виде значения или адреса:
class A
{
…
}
class B
{
<return_type> met_B(A* a) ;
…
}
Рис. 17.6. Диаграмма использования (клиент-серверного взаимодействия)
Объект класса B использует ресурсы объекта класса A и может изменить состояние объекта класса A (рис. 17.6)
Ассоциация – это двусторонняя связь классов, которая устанавливается между самостоятельными объектами, причем и со стороны одного класса, и со стороны другого класса в связи могут участвовать несколько объектов. Например, классы студентов и преподавателей – каждый студент посещает занятия нескольких преподавателей, в то же время каждый преподаватель проводит занятия с группой студентов. Количество объектов, участвующих в связи с обеих сторон, называется мощностью связи.
Классы, с которыми устанавливается ассоциативная связь, должны иметь переменные-указатели на объекты ассоциированного класса:
class A
{
B* varA; //Указатель на один объект класса B
…
}
class B
{
A** varB; //Указатель на массив объектов класса A
…
}
В этом примере со стороны класса B в связи участвует один объект, а со стороны класса A – несколько объектов (рис. 17.7).
Рис. 17.7. Диаграмма ассоциации классов: 1, N - количество объектов, участвующих в связи от класса B и A соответственно
В зависимости от количества объектов, участвующих в связи с обеих сторон, различают три типа ассоциации: один-к-одному, один-ко-многим (этот тип выбран для примера), много-ко-многим.
Ассоциативная связь используется при построении реляционных баз данных.
В заключение рассмотрим диаграмму классов, отображающую объектную модель рабочего места пользователя (рис. 17.8).
Рис. 17.8. Диаграмма классов рабочего места пользователя
На диаграмме представлены пять классов, между которыми установлены различные виды взаимодействия. Класс Пользователь представляет собой набор настроек пользователя и взаимодействует с классами Компьютер и Принтер. Между Пользователем и Компьютером устанавливается ассоциативная связь один-ко-много, так как представители обоих классов – независимые объекты, общение между объектами двунаправленное, а количество пользователей, работающих на компьютере, может быть любым. Между Пользователем и Принтером установлено клиент-серверное взаимодействие, так как оба объекта существуют независимо друг от друга, направление их взаимодействия одностороннее – от Пользователя к Принтеру. Классы Принтер и Компьютер представляют собой реальные устройства, имеющие некоторые общие свойства. Эти общие характеристики выделены в абстрактный класс Устройство, использующийся в качестве базового при создании классов Принтер и Компьютер. Абстрактный класс имеет особое назначение: он предназначен для создания классов-наследников и не используется в программе для создания объектов. На диаграмме классов абстрактный класс обозначен буквой А. Пятый класс Картридж представляет собой составную часть Принтера и не является самостоятельным объектом, поэтому между этими двумя классами выбран тип взаимодействия агрегация (включение).
