Menu
Coddy logo textTech

Структуры как объекты

Часть раздела Объектно-ориентированное программирование путешествия по 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.

challenge icon

Задание

Легко

Давайте создадим простой модуль Counter, который рассматривает struct как объект с поведением. Вы организуете код в трёх файлах, чтобы попрактиковаться в шаблоне объединения данных с функциями, которые с ними работают.

Вы создадите три файла:

  • counter.h: ваш заголовочный файл, объявляющий struct Counter с единственным членом 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;
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Объектно-ориентированное программирование

Потренируйтесь самостоятельно: Онлайн-компилятор C