Реализация прямоугольника
Часть раздела Object Oriented Programming путешествия по C на Coddy — урок 46 из 61.
Задание
ЛегкоДавайте продолжим создание проекта Shape Drawer, реализовав Rectangle — еще одну конкретную фигуру, которая встраивает базовую структуру Shape, точно так же, как мы это делали с Circle.
Опираясь на ваш существующий проект, вы добавите функциональность прямоугольника в следующие файлы:
shape.h: Сохраните ваш базовый интерфейсShapeс типами указателей на функцииDrawFuncиAreaFuncиз предыдущих уроков.circle.hиcircle.c: Сохраните вашу реализацию Circle из предыдущего урока.rectangle.h: Определите здесь структуруRectangle. Прямоугольник встраиваетShapeв качестве своего первого члена и добавляет поляwidthиheight(оба типаdouble). Объявите функцию-конструкторcreate_rectangle, которая принимает параметры ширины и высоты и возвращаетRectangleпо значению.rectangle.c: Реализуйте поведение, специфичное для прямоугольника:draw_rectangle— выводитDrawing Rectangle with width: X.XX and height: X.XX(оба значения отображаются с 2 знаками после запятой)area_rectangle— возвращает произведение ширины на высотуcreate_rectangle— инициализируетRectangle, связывает указатели на функции встроенногоShapeс функциями прямоугольника, устанавливает размеры и возвращает прямоугольник
main.c: Продемонстрируйте работу обеих фигур через один и тот же интерфейс. Считайте два входных значения: ширину и высоту для прямоугольника. Создайте прямоугольник с помощью конструктора, затем вызовитеdrawиareaчерез указатели на функции встроенногоShape. Выведите площадь с 2 знаками после запятой.
Ваша программа получит два входных значения: width и height (в виде чисел с плавающей точкой).
Пример вывода, когда входные данные равны 4.0 и 3.0:
Drawing Rectangle with width: 4.00 and height: 3.00
Area: 12.00Пример вывода, когда входные данные равны 7.5 и 2.5:
Drawing Rectangle with width: 7.50 and height: 2.50
Area: 18.75Как и в случае с Circle, Rectangle встраивает Shape в качестве своего первого члена, что позволяет вам получать доступ к указателям на функции через встроенный член. Этот последовательный паттерн — то, что обеспечивает полиморфизм: обе фигуры могут обрабатываться единообразно через их интерфейс Shape. Не забудьте использовать include guards во всех заголовочных файлах.
Попробуйте сами
#include <stdio.h>
#include "shape.h"
#include "rectangle.h"
int main() {
double width, height;
scanf("%lf", &width);
scanf("%lf", &height);
// TODO: Создайте прямоугольник, используя create_rectangle(width, height)
// TODO: Вызовите draw через указатель на функцию встроенной структуры Shape
// TODO: Вызовите area через указатель на функцию встроенной структуры Shape
// TODO: Выведите площадь с 2 знаками после запятой: "Area: %.2f\n"
return 0;
}Все уроки раздела Object Oriented Programming
1Основы модульного программирования
Заголовочные файлыСтражи включенияИсходные файлыСтатические функцииПовторение: Модульный калькулятор4Инкапсуляция
Концепция непрозрачных указателейОпределение непрозрачных структурГеттеры и сеттерыВалидация в сеттерахИтоги: Секретный ящик2Объекты и методы
Структуры как объектыУказатель 'Self'Константная корректностьУказатель против значенияВспомогательные методыИтоги: Point Manager5Проект: Простой банковский счет
Настройка проектаРеализация счета3Жизненный цикл объекта
Паттерн «Конструктор»Паттерн «Деструктор»Инициализация в стекеГлубокое копированиеПовторение: String Wrapper6Наследование через композицию
Встраивание структурПравило первого элементаДоступ к элементам родителяUpcastingПовторение: Иерархия фигур9Проект: Рисование фигур
Обзор проектаРеализация круга