Реализация круга
Часть раздела Объектно-ориентированное программирование путешествия по C на Coddy. Урок 45 из 61.
Задание
ЛегкоПродолжим создавать проект Shape Drawer, реализовав Circle: конкретную фигуру, которая встраивает базовую структуру Shape и предоставляет собственную логику рисования и вычисления площади.
Основываясь на фундаменте из предыдущего урока, вы расширите проект следующими файлами:
shape.h: Сохраните интерфейс базовойShapeиз предыдущего урока с типами указателей на функцииDrawFuncиAreaFunc.circle.h: Определите здесь структуруCircle. Круг встраиваетShapeкак свой first member (что позволяет применять правило first member для восходящего приведения типов) и добавляет полеradiusтипаdouble. Объявите функцию-конструкторcreate_circle, которая принимает радиус и возвращает значение типаCircle.circle.c: Реализуйте здесь поведение, специфичное для круга:draw_circle: выводитDrawing Circle with radius: X.XX(радиус отображается с 2 десятичными знаками)area_circle: возвращает π × радиус² (используйте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 в качестве своего first member, поэтому вы можете обращаться к указателям на функции через circle.base.draw и circle.base.area (или как бы вы ни назвали встроенный member). При вызове этих функций передавайте указатель на member Shape. Не забудьте использовать защиту от повторного включения во всех заголовочных файлах.
Попробуйте сами
#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;
}Все уроки раздела Объектно-ориентированное программирование
1Основы модульного программирования
Заголовочные файлыСтражи включенияИсходные файлыСтатические функцииПовторение: Модульный калькулятор4Инкапсуляция
Концепция непрозрачных указателейОпределение непрозрачных структурГеттеры и сеттерыВалидация в сеттерахИтоги: Секретный ящик2Объекты и методы
Структуры как объектыУказатель 'Self'Константная корректностьУказатель против значенияВспомогательные методыИтоги: Point Manager5Проект: Простой банковский счет
Настройка проектаРеализация счета3Жизненный цикл объекта
Паттерн «Конструктор»Паттерн «Деструктор»Инициализация в стекеГлубокое копированиеПовторение: String Wrapper6Наследование через композицию
Встраивание структурПравило первого элементаДоступ к элементам родителяUpcastingПовторение: Иерархия фигур9Проект: Рисование фигур
Обзор проектаРеализация кругаРеализация прямоугольникаПолиморфное использованиеКонтейнер фигурПотренируйтесь самостоятельно: Онлайн-компилятор C