Menu
Coddy logo textTech

Геттеры и сеттеры

Часть раздела Объектно-ориентированное программирование путешествия по C на Coddy. Урок 19 из 61.

С opaque pointers члены структуры скрыты от внешнего кода. Но если внешний код не может получить прямой доступ к данным, как нам читать или изменять их? Ответ — функции getter и setter: публичные интерфейсы, обеспечивающие контролируемый доступ к закрытым данным.

A getter возвращает значение скрытого member:

// counter.h
int counter_get_value(const Counter *c);

// counter.c
int counter_get_value(const Counter *c) {
    return c->value;
}

Сеттер изменяет скрытый member:

// counter.h
void counter_set_value(Counter *c, int new_value);

// counter.c
void counter_set_value(Counter *c, int new_value) {
    c->value = new_value;
}

Обратите внимание на соглашение об именовании: добавляйте к именам функций префикс с именем типа (counter_), чтобы избежать конфликтов и сделать API понятным. getter используют указатели const, поскольку они не изменяют объект.

Теперь внешний код может безопасно взаимодействовать со скрытыми данными:

// main.c
Counter *c = create_counter(10);
printf("%d\n", counter_get_value(c));  // 10
counter_set_value(c, 25);
printf("%d\n", counter_get_value(c));  // 25

Этот pattern даёт вам полный контроль над тем, как осуществляется доступ к данным: это основа, на которой мы будем строить следующий урок, добавляя логику проверки в сеттеры.

challenge icon

Задание

Легко

Давайте создадим модуль Score, который использует шаблон непрозрачного указателя с функциями getter и setter. Вы создадите скрытый трекер score, с которым внешний код сможет взаимодействовать только через предоставляемый вами публичный интерфейс.

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

  • score.h: ваш публичный интерфейс. Объявите непрозрачный тип Score с помощью предварительного объявления (без тела структуры!). Объявите следующие функции:
    • create_score: принимает integer для initial points и возвращает указатель Score
    • free_score: принимает указатель Score и освобождает memory
    • score_get_points: getter, который принимает const Score * и возвращает текущие points
    • score_set_points: setter, который принимает Score * и integer, обновляя значение points
    Используйте include guards с символом SCORE_H.
  • score.c: Определите actual struct Score с одним скрытым member: int points. Implement все четыре функции. Ваш getter должен возвращать скрытое значение, а setter — обновлять его. Remember, что getter используют указатели const, поскольку они не изменяют объект.
  • main.c: Продемонстрируйте работу модуля, создав score, считав его значение, изменив его через setter и снова считав его.

Вы получите два входных значения: initial points (integer) и new points value (integer), которое нужно установить.

В вашем main-файле создайте Score с initial points, выведите текущее значение с помощью getter, обновите его с помощью setter, используя новое значение, выведите обновлённое значение, затем освободите score и выведите подтверждение.

Выведите результат в следующем формате:

Initial: {points}
Updated: {points}
Freed

Например, для входных значений 100 и 250 результат будет таким:

Initial: 100
Updated: 250
Freed

Обратите внимание, что main.c не может обращаться к points напрямую. Он должен использовать ваши getter и setter functions. Это инкапсуляция в действии: вы точно контролируете, как скрытые данные могут быть прочитаны и изменены.

Попробуйте сами

#include <stdio.h>
#include "score.h"

int main() {
    int initial_points, new_points;
    scanf("%d", &initial_points);
    scanf("%d", &new_points);
    
    // TODO: Создайте Score с initial_points
    
    // TODO: Выведите начальное значение, используя getter
    // Формат: "Initial: {points}"
    
    // TODO: Обновите score, используя setter с new_points
    
    // TODO: Выведите обновлённое значение, используя getter
    // Формат: "Updated: {points}"
    
    // TODO: Освободите score и выведите "Freed"
    
    return 0;
}
quiz iconПроверьте себя

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

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

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