Структуры как объекты
Часть раздела Объектно-ориентированное программирование путешествия по C на Coddy. Урок 6 из 61.
В объектно-ориентированных языках объект — это сущность, которая объединяет данные (состояние) с функциями, работающими с этими данными (методами). В C нет встроенных объектов, но мы можем достичь той же концепции, используя структуры и функции.
Представляй себе struct как «часть данных» объекта. Он хранит состояние: значения, которые определяют, чем объект является в данный момент:
typedef struct {
int value;
} Counter;
Эта структура Counter представляет сущность с единственным элементом состояния: её текущим значением. Чтобы наделить её поведением, мы пишем функции, которые принимают структуру в качестве параметра:
void counter_increment(Counter *c) {
c->value++;
}
int counter_get(Counter *c) {
return c->value;
}
Эти функции действуют как методы. Они работают непосредственно с данными Counter. Передавая структуру функциям, мы имитируем то, что другие языки делают автоматически при вызове counter.increment().
int main() {
Counter my_counter = {0};
counter_increment(&my_counter);
printf("%d\n", counter_get(&my_counter)); // Выводит: 1
return 0;
}
Соглашение об именовании typename_action (например, counter_increment) помогает организовать код и ясно показывает, к какой структуре относится функция. Этот шаблон лежит в основе объектно-ориентированного программирования в C.
Задание
ЛегкоДавайте создадим простой модуль Counter, который рассматривает struct как объект с поведением. Вы организуете код в трёх файлах, чтобы попрактиковаться в шаблоне объединения данных с функциями, которые с ними работают.
Вы создадите три файла:
counter.h: ваш заголовочный файл, объявляющий structCounterс единственным членомint value. Также объявите две функции, выступающие в роли «методов» для счётчика:counter_increment(takes указатель на Counter и увеличивает его значение на 1) иcounter_get(takes указатель на Counter и returns его текущее значение). Используйте include guards с символомCOUNTER_H.counter.c: ваш исходный файл, реализующий обе функции. Не забудьте подключить заголовочный файл.main.c: ваш главный файл, который создаёт Counter, выполняет над ним операции и отображает результаты.
Вы получите два целочисленных входных значения: начальное значение вашего счётчика и number of times, на которое его нужно увеличить.
В главном файле initialize Counter начальным значением, затем вызовите counter_increment указанное количество раз. Наконец, используйте counter_get, чтобы retrieve и вывести итоговое значение.
Выведите result в следующем формате:
Final value: {result}Например, при начальном значении 5 и 3 увеличениях результатом был бы:
Final value: 8Попробуйте сами
#include <stdio.h>
#include "counter.h"
int main() {
// Считать ввод
int starting_value;
int num_increments;
scanf("%d", &starting_value);
scanf("%d", &num_increments);
// TODO: Создать Counter и инициализировать его значением starting_value
// TODO: Вызвать counter_increment указанное количество раз
// TODO: Использовать counter_get, чтобы получить итоговое значение и вывести его
// Формат вывода: "Final value: {result}"
return 0;
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Основы модульного программирования
Заголовочные файлыСтражи включенияИсходные файлыСтатические функцииПовторение: Модульный калькулятор4Инкапсуляция
Концепция непрозрачных указателейОпределение непрозрачных структурГеттеры и сеттерыВалидация в сеттерахИтоги: Секретный ящик2Объекты и методы
Структуры как объектыУказатель 'Self'Константная корректностьУказатель против значенияВспомогательные методыИтоги: Point Manager5Проект: Простой банковский счет
Настройка проектаРеализация счета3Жизненный цикл объекта
Паттерн «Конструктор»Паттерн «Деструктор»Инициализация в стекеГлубокое копированиеПовторение: String Wrapper6Наследование через композицию
Встраивание структурПравило первого элементаДоступ к элементам родителяUpcastingПовторение: Иерархия фигур9Проект: Рисование фигур
Обзор проектаРеализация кругаРеализация прямоугольникаПолиморфное использованиеКонтейнер фигурПотренируйтесь самостоятельно: Онлайн-компилятор C