Итоги: Секретный ящик
Часть раздела Объектно-ориентированное программирование путешествия по C на Coddy. Урок 21 из 61.
Задание
ЛегкоДавайте создадим модуль Box, демонстрирующий полную инкапсуляцию. Ваш блок будет иметь три скрытых измерения — width, height и depth, — доступ к которым можно получить только через предоставленные вами функции. Это полный шаблон непрозрачного указателя в действии!
Вы создадите три файла:
box.h: ваш публичный интерфейс. Объявите непрозрачный типBox, используя только предварительное объявление: тело структуры должно оставаться скрытым. Объявите следующие функции:create_box: принимает три целых числа (width, height, depth) и возвращает указатель на Boxdestroy_box: освобождает выделенную памятьget_volume: принимаетconst Box *и возвращает объём (width × height × depth)set_dimensions: принимает указатель на Box и три новых значения измерений, возвращаетint(1 при успехе, 0, если какое-либо измерение отрицательно или равно нулю)
BOX_H.box.c: определите фактическуюstruct Boxс тремя скрытыми членами:int width,int heightиint depth. Реализуйте все четыре функции. Ваш конструктор должен выделять память и инициализировать блок. Функцияset_dimensionsдолжна проверять, что все три значения положительны (больше нуля), прежде чем применять изменения; если какое-либо значение не проходит проверку, отклоните всё обновление и верните 0.main.c: продемонстрируйте работу инкапсулированного Box, создав его, проверив его объём, попытавшись изменить измерения (как допустимыми, так и недопустимыми значениями), а затем корректно освободив ресурсы.
Вы получите пять входных значений: начальную ширину, начальную высоту, начальную глубину, а затем три новых измерения, которые нужно попытаться установить (они могут содержать недопустимые значения).
В основном файле создайте Box с начальными измерениями и выведите его объём. Затем попытайтесь установить новые измерения: выведите, успешно ли выполнено обновление, и получившийся объём. Наконец, освободите Box и подтвердите очистку.
Выведите результат в следующем формате:
Volume: {volume}
Set: {0 or 1}
Volume: {volume}
DestroyedНапример, при входных значениях 2, 3, 4, 5, 5, 5 результат будет таким:
Volume: 24
Set: 1
Volume: 125
DestroyedПри входных значениях 2, 3, 4, -1, 5, 5 результат будет таким:
Volume: 24
Set: 0
Volume: 24
DestroyedОбратите внимание, как проверка в set_dimensions защищает ваш Box от недопустимых состояний: внешний код не может обойти ваши правила, поскольку измерения полностью скрыты за вашим интерфейсом.
Попробуйте сами
#include <stdio.h>
#include "box.h"
int main() {
// Прочитать начальные размеры
int width, height, depth;
scanf("%d", &width);
scanf("%d", &height);
scanf("%d", &depth);
// Прочитать новые размеры для попытки
int new_w, new_h, new_d;
scanf("%d", &new_w);
scanf("%d", &new_h);
scanf("%d", &new_d);
// TODO: Создать Box с начальными размерами
// TODO: Вывести начальный объём в формате: "Volume: {volume}"
// TODO: Попытаться установить новые размеры и сохранить результат
// TODO: Вывести, удалась ли установка, в формате: "Set: {0 or 1}"
// TODO: Вывести получившийся объём в формате: "Volume: {volume}"
// TODO: Уничтожить box и вывести "Destroyed"
return 0;
}
Все уроки раздела Объектно-ориентированное программирование
1Основы модульного программирования
Заголовочные файлыСтражи включенияИсходные файлыСтатические функцииПовторение: Модульный калькулятор4Инкапсуляция
Концепция непрозрачных указателейОпределение непрозрачных структурГеттеры и сеттерыВалидация в сеттерахИтоги: Секретный ящик2Объекты и методы
Структуры как объектыУказатель 'Self'Константная корректностьУказатель против значенияВспомогательные методыИтоги: Point Manager5Проект: Простой банковский счет
Настройка проектаРеализация счета3Жизненный цикл объекта
Паттерн «Конструктор»Паттерн «Деструктор»Инициализация в стекеГлубокое копированиеПовторение: String Wrapper6Наследование через композицию
Встраивание структурПравило первого элементаДоступ к элементам родителяUpcastingПовторение: Иерархия фигур9Проект: Рисование фигур
Обзор проектаРеализация кругаРеализация прямоугольникаПолиморфное использованиеКонтейнер фигурПотренируйтесь самостоятельно: Онлайн-компилятор C