Menu
Coddy logo textTech

Указатель 'Self'

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

В объектно-ориентированных языках, таких как Python или Java, когда вы вызываете object.method(), язык автоматически передаёт сам объект методу. В C мы должны делать это вручную, передавая указатель на struct в качестве первого аргумента.

Этот указатель обычно называют self (заимствовано из Python) или this (из C++). Он предоставляет функции доступ к данным struct, чтобы она могла читать или изменять их:

typedef struct {
    int health;
} Player;

void player_take_damage(Player *self, int amount) {
    self->health -= amount;
}

Указатель self — это то, что заставляет function работать как метод. Он знает, какого именно player нужно изменить. Без него function не имела бы возможности получить доступ к конкретному экземпляру struct. При вызове этой function передайте адрес своей struct:

Player hero = {100};
player_take_damage(&hero, 25);
// hero.health теперь 75

Использование указателя (вместо непосредственной передачи структуры) необходимо для внесения изменений. Если бы вы передали структуру по значению, функция получила бы копию, и все изменения были бы потеряны после возврата из функции. Указатель гарантирует, что изменения сохранятся в исходной структуре.

challenge icon

Задание

Легко

Давайте создадим модуль Timer, который отслеживает прошедшие секунды. Вы попрактикуетесь в использовании шаблона указателя "self" для изменения внутреннего состояния struct с помощью функций, действующих как методы.

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

  • timer.h: Объявите struct Timer с единственным членом int seconds. Также объявите две функции: timer_tick (takes указатель на Timer и добавляет указанное количество секунд) и timer_reset (takes указатель на Timer и устанавливает seconds обратно в zero). Используйте include guards с символом TIMER_H.
  • timer.c: Реализуйте обе функции. Функция timer_tick должна accept Timer *self и int amount, а затем добавлять amount к seconds таймера. Функция timer_reset должна accept Timer *self и устанавливать его seconds в zero.
  • main.c: Создайте Timer, выполните над ним операции и выведите результаты.

Вы получите два целых входных значения: начальные seconds для вашего таймера и amount для добавления с помощью tick.

В вашем основном файле:

  1. Инициализируйте Timer значением начальных seconds
  2. Вызовите timer_tick, чтобы добавить указанное amount
  3. Выведите текущие seconds
  4. Вызовите timer_reset, чтобы сбросить таймер
  5. Снова выведите seconds (should быть 0)

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

After tick: {seconds}
After reset: {seconds}

Например, при начальном значении 30 и добавлении 15 секунд результатом будет:

After tick: 45
After reset: 0
REQUIRED OUTPUT FORMAT: [Your translated content here]

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

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

int main() {
    int initial_seconds, amount_to_add;
    scanf("%d", &initial_seconds);
    scanf("%d", &amount_to_add);
    
    // TODO: Создайте Timer и инициализируйте его с initial_seconds
    
    // TODO: Вызовите timer_tick, чтобы добавить amount_to_add секунд
    
    // TODO: Выведите текущие секунды в формате: "After tick: {seconds}"
    
    // TODO: Вызовите timer_reset, чтобы сбросить таймер
    
    // TODO: Снова выведите секунды в формате: "After reset: {seconds}"
    
    return 0;
}
quiz iconПроверьте себя

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

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

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