Реализация круга
Часть раздела Object Oriented Programming путешествия по C на Coddy — урок 45 из 61.
Задание
ЛегкоДавайте продолжим создание проекта Shape Drawer, реализовав Circle — конкретную фигуру, которая встраивает базовую структуру Shape и предоставляет собственную логику рисования и вычисления площади.
Опираясь на фундамент предыдущего урока, вы расширите свой проект следующими файлами:
shape.h: Сохраните ваш базовый интерфейсShapeиз предыдущего урока с типами указателей на функцииDrawFuncиAreaFunc.circle.h: Определите здесь структуруCircle. Круг встраиваетShapeв качестве своего первого члена (что позволяет использовать правило первого члена для восходящего приведения типов) и добавляет полеradiusтипаdouble. Объявите функцию-конструкторcreate_circle, которая принимает радиус и возвращаетCircleпо значению.circle.c: Реализуйте здесь специфичное для круга поведение:draw_circle— выводитDrawing Circle with radius: X.XX(радиус отображается с 2 знаками после запятой)area_circle— возвращает π × radius² (используйте3.14159для π)create_circle— инициализируетCircle, связывает указатели на функции встроеннойShapeсdraw_circleиarea_circle, устанавливает радиус и возвращает круг
main.c: Соберите всё вместе. Считайте значение радиуса из входных данных, создайте круг с помощью конструктора, затем вызовитеdrawиareaчерез указатели на функции встроеннойShape. Выведите площадь с 2 знаками после запятой.
Ваша программа получит один входной параметр: значение radius (в виде числа с плавающей точкой).
Пример вывода, когда входное значение равно 5.0:
Drawing Circle with radius: 5.00
Area: 78.54Пример вывода, когда входное значение равно 3.5:
Drawing Circle with radius: 3.50
Area: 38.48Ключевая идея заключается в том, что Circle содержит Shape в качестве своего первого члена, поэтому вы можете получить доступ к указателям на функции через circle.base.draw и circle.base.area (или как бы вы ни назвали встроенный член). При вызове этих функций передавайте указатель на член Shape. Не забудьте использовать include guards во всех заголовочных файлах.
Попробуйте сами
#include <stdio.h>
#include "shape.h"
#include "circle.h"
int main() {
double radius;
scanf("%lf", &radius);
// TODO: Создать Circle, используя create_circle
// TODO: Вызвать draw через указатель на функцию встроенной структуры Shape
// TODO: Вызвать area через указатель на функцию встроенной структуры Shape
// и вывести результат с 2 знаками после запятой: "Area: %.2f\n"
return 0;
}Все уроки раздела Object Oriented Programming
1Основы модульного программирования
Заголовочные файлыСтражи включенияИсходные файлыСтатические функцииПовторение: Модульный калькулятор4Инкапсуляция
Концепция непрозрачных указателейОпределение непрозрачных структурГеттеры и сеттерыВалидация в сеттерахИтоги: Секретный ящик2Объекты и методы
Структуры как объектыУказатель 'Self'Константная корректностьУказатель против значенияВспомогательные методыИтоги: Point Manager5Проект: Простой банковский счет
Настройка проектаРеализация счета3Жизненный цикл объекта
Паттерн «Конструктор»Паттерн «Деструктор»Инициализация в стекеГлубокое копированиеПовторение: String Wrapper6Наследование через композицию
Встраивание структурПравило первого элементаДоступ к элементам родителяUpcastingПовторение: Иерархия фигур9Проект: Рисование фигур
Обзор проектаРеализация круга