- •1 Определение интерфейса класса
- •Определение проблемы
- •Реализация класса сВох
- •Сравнение объектов cBox
- •Функция проверки того, больше ли константа объекта сВох
- •Комбинирование объектов сВох
- •Анализ объектов cBox
- •2 Многофайловый проект, использующий класс cBox
- •Определение класса сВох
- •Определение конструктора
- •Добавление функций-членов
- •Добавление глобальных функций
- •3 Использование класса сВох
Лабораторная работа 1. Создание многофайлового проекта, использующего класс
Цель занятия:
совершенствовать навыки разработки программ;
совершенствовать навыки работы с интегрированной средой разработки MS Visual C++;
изучить фундаментальные аспекты определения классов;
приобрести начальные навыки разработки многофайловых приложений с использованием возможностей мастеров MS Visual C++.
Время на выполнение работы: 4 часа
Учебные вопросы:
Определение интерфейса класса
Использование Мастера создания классов С++
Использование разработанного класса
Подготовка к выполнению работы:
Изучить рекомендованную литературу (понятие класса и объекта, шаблоны классов).
Изучить материал настоящего руководства.
Материалы для подготовки к занятию:
Конспект лекций
[1] стр. 265-285.
1 Определение интерфейса класса
Реализация расширенного класса СВох должна включать понятие интерфейса класса. Необходимо разработать набор инструментов для всех, кто захочет иметь дело с объектами класса СВох. Нам понадобится собрать множество функций, предоставляющих интерфейс к миру ящиков. Поскольку интерфейс — это лишь способ работы с объектами класса СВох, он должен быть определен так, чтобы учитывать все возможные действия с объектом СВох, и быть реализованным так, чтобы, насколько возможно, предотвращать неправильное понимание и непреднамеренные ошибки.
Первый вопрос, который необходимо рассмотреть при проектировании класса, — это природа подлежащей решению проблемы, и, исходя из этого, определить вид функций, представляемых в интерфейсе класса.
Определение проблемы
Принципиальное назначение ящика — содержать объекты того или иного типа, что можно обозначить одним словом: упаковка. Попытаемся представить класс, который вообще избавляет от проблем упаковки, и посмотрим, как он может использоваться. Предположим, что всегда можно упаковать объекты СВох в другой объект СВох, потому что, если мы хотим упаковать конфеты в коробку, то всегда можем представить каждую конфету как идеализированный объект СВох. Основные операции, которые можно представить в классе СВох, перечислены ниже.
Вычисление объема СВох. Это фундаментальная характеристика объекта СВох, и ее реализация у вас уже имеется.
Сравнение объемов двух объектов СВох для определения того, который из них больше. Вероятно, необходимо поддерживать полный набор операций сравнения для объектов СВох. Версия оператора > у вас уже есть.
Сравнение объема объекта СВох с указанным значением, и наоборот. Реализация этого оператора > также уже имеется, но функции, поддерживающие другие операторы сравнения, придется реализовать дополнительно.
Сложение двух объектов СВох для создания нового объекта СВох, который будет содержать оба исходных. Таким образом, результат будет иметь как минимум сумму их объемов, но может быть и больше. У вас уже есть эта версия, которая перегружает оператор +.
Умножение объекта СВох на целое число (и наоборот (целого числа на объект СВох)) для создания объекта СВох, который будет содержать указанное количество исходных объектов. Это позволит эффективно моделировать коробку, в которую пакуется группа ящиков.
Определение количества объектов СВох заданного размера, которое можно упаковать в другой объект СВох заданного размера. Это, по сути, деление, поэтому вы могли бы реализовать его, перегрузив оператор /.
Определение объема свободного пространства, которое остается в объекте СВох после помещения в него максимального количества объектов СВох заданного размера.
Реализация класса сВох
Вам следует подумать о степени защиты от ошибок, которую вы хотите встроить в класс СВох. Базовый класс, который мы определили для иллюстрации различных аспектов классов, является начальной точкой, но необходимо также более глубоко рассмотреть некоторые моменты. В предложенном дизайне конструктор — слабое место, поскольку он не гарантирует правильности размерностей СВох, поэтому, возможно, первое, что вам потребуется сделать, — это гарантировать, что вы всегда получите корректные объекты. Чтобы это сделать, можно переопределить базовый класс, как показано ниже.
Теперь конструктор безопасен, потому что любая размерность, которую пользователь класса попытается указать как отрицательное число или нуль, в конструкторе автоматически заменяется единицей. Вы можете также вывести в этом случае сообщение, поскольку это, очевидно, ошибочная ситуация, и произвольная и молчаливая установка размера в 1 может оказаться не лучшим решением.
Стандартный конструктор копирования удовлетворителен для нашего класса, так как здесь нет никакого динамического выделения памяти для переменных-членов, и оператор присвоения также будет работать, как надо. Стандартный деструктор также в этом случае работает отлично, и нет необходимости переопределять его. Возможно, теперь следует рассмотреть, что понадобится для поддержки сравнения объектов нашего класса.
