Вспомогательные методы
Часть раздела Объектно-ориентированное программирование путешествия по C на Coddy. Урок 10 из 61.
До сих пор мы видели function, которые изменяют данные структур (например, player_take_damage), и function, которые просто отображают их. Но существует ещё одна важная категория: function, которые вычисляют производные значения на основе членов структур, ничего не изменяя.
Рассмотрим структуру Rectangle, в которой хранятся ширина и height. Площадь не хранится: она вычисляется по запросу:
typedef struct {
double width;
double height;
} Rectangle;
double rectangle_area(const Rectangle *self) {
return self->width * self->height;
}
double rectangle_perimeter(const Rectangle *self) {
return 2 * (self->width + self->height);
}
Это helper methods. Они берут существующие данные структуры и создают новое значение. Обратите внимание, что они используют указатели const, поскольку only read и никогда не записывают данные. Вычисленный результат возвращается, а не сохраняется в структуре.
Rectangle box = {5.0, 3.0};
printf("Area: %.1f\n", rectangle_area(&box)); // 15.0
printf("Perimeter: %.1f\n", rectangle_perimeter(&box)); // 16.0
Этот шаблон помогает сделать ваши структуры компактными: храните только необходимые данные, а всё остальное вычисляйте по мере необходимости. Он также гарантирует, что производные значения всегда соответствуют текущему состоянию.
Задание
ЛегкоДавайте создадим модуль Circle, который вычисляет производные значения на основе сохранённых данных. Вы попрактикуетесь в написании вспомогательных методов: функций, которые вычисляют results из членов структуры, не изменяя их.
Вы создадите три файла:
circle.h: Declare структуруCircleс единственным членомdouble radius. Также Declare два вспомогательных метода:circle_area: принимает указательconstна Circle и возвращает areacircle_circumference: принимает указательconstна Circle и возвращает circumference
CIRCLE_H.circle.c: Implement оба вспомогательных метода. Для вычислений используйте3.14159в качестве значения числа пи. Формула area —pi * radius * radius, а формула circumference —2 * pi * radius. Обе функции должны only читать radius: никогда не изменяйте его.main.c: Create Circle и используйте вспомогательные методы, чтобы вычислить и отобразить его свойства.
Вы получите одни входные данные: radius окружности (как double).
В основном файле инициализируйте Circle с given radius, затем используйте вспомогательные методы, чтобы вычислить и вывести area и circumference.
Выведите results в следующем формате:
Area: {area}
Circumference: {circumference}Используйте %.2f для обоих значений, чтобы отображать два знака после десятичной точки.
Например, при radius, равном 5.0, вывод будет таким:
Area: 78.54
Circumference: 31.42Попробуйте сами
#include <stdio.h>
#include "circle.h"
int main() {
double radius;
scanf("%lf", &radius);
// TODO: Создайте структуру Circle с заданным радиусом
// TODO: Use circle_area and circle_circumference helper methods
// чтобы вычислить и вывести результаты
// Формат вывода:
// printf("Area: %.2f\n", ...);
// printf("Circumference: %.2f\n", ...);
return 0;
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Основы модульного программирования
Заголовочные файлыСтражи включенияИсходные файлыСтатические функцииПовторение: Модульный калькулятор4Инкапсуляция
Концепция непрозрачных указателейОпределение непрозрачных структурГеттеры и сеттерыВалидация в сеттерахИтоги: Секретный ящик2Объекты и методы
Структуры как объектыУказатель 'Self'Константная корректностьУказатель против значенияВспомогательные методыИтоги: Point Manager5Проект: Простой банковский счет
Настройка проектаРеализация счета3Жизненный цикл объекта
Паттерн «Конструктор»Паттерн «Деструктор»Инициализация в стекеГлубокое копированиеПовторение: String Wrapper6Наследование через композицию
Встраивание структурПравило первого элементаДоступ к элементам родителяUpcastingПовторение: Иерархия фигур9Проект: Рисование фигур
Обзор проектаРеализация кругаРеализация прямоугольникаПолиморфное использованиеКонтейнер фигурПотренируйтесь самостоятельно: Онлайн-компилятор C