Menu
Coddy logo textTech

O Ponteiro 'Self'

Parte da seção Programação Orientada a Objetos do Journey de C da Coddy. Lição 7 de 61.

Em linguagens orientadas a objetos como Python ou Java, quando você chama object.method(), a linguagem passa automaticamente o próprio objeto para o método. Em C, devemos fazer isso manualmente passando um ponteiro para a struct como primeiro argumento.

Esse ponteiro é convencionalmente chamado de self (emprestado do Python) ou this (do C++). Ele dá à função acesso aos dados da struct para que ela possa lê-los ou modificá-los:

typedef struct {
    int health;
} Player;

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

O ponteiro self é o que faz a função agir como um método. Ele sabe qual jogador modificar. Sem ele, a função não teria como acessar a instância específica da struct. Ao chamar essa função, você passa o endereço da sua struct:

Player hero = {100};
player_take_damage(&hero, 25);
// hero.health agora é 75

Usar um ponteiro (em vez de passar a struct diretamente) é essencial para a modificação. Se você passasse a struct por valor, a função receberia uma cópia, e quaisquer alterações seriam perdidas quando a função retornasse. O ponteiro garante que as alterações persistam na struct original.

challenge icon

Desafio

Fácil

Vamos criar um módulo Timer que acompanha os segundos decorridos. Você praticará o uso do padrão de ponteiro "self" para modificar o estado interno de uma struct por meio de funções que atuam como métodos.

Você criará três arquivos:

  • timer.h: Declare uma struct Timer com um único membro int seconds. Declare também duas funções: timer_tick (recebe um ponteiro para Timer e adiciona uma quantidade especificada de segundos) e timer_reset (recebe um ponteiro para Timer e redefine seconds para zero). Use guardas de inclusão com o símbolo TIMER_H.
  • timer.c: Implemente ambas as funções. A função timer_tick deve aceitar um Timer *self e um int amount, adicionando então amount aos segundos do timer. A função timer_reset deve aceitar um Timer *self e definir seus segundos como zero.
  • main.c: Crie um Timer, execute operações nele e exiba os resultados.

Você receberá duas entradas inteiras: os segundos iniciais do seu timer e a quantidade a adicionar por meio de tick.

No seu arquivo main:

  1. Inicialize um Timer com o valor dos segundos iniciais
  2. Chame timer_tick para adicionar a quantidade especificada
  3. Imprima os segundos atuais
  4. Chame timer_reset para redefinir o timer
  5. Imprima os segundos novamente (deve ser 0)

Imprima os resultados neste formato:

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

Por exemplo, com um valor inicial de 30 e adicionando 15 segundos, a saída seria:

After tick: 45
After reset: 0

Experimente você mesmo

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

int main() {
    int initial_seconds, amount_to_add;
    scanf("%d", &initial_seconds);
    scanf("%d", &amount_to_add);
    
    // TODO: Crie um Timer e inicialize-o com initial_seconds
    
    // TODO: Chame timer_tick para adicionar amount_to_add segundos
    
    // TODO: Imprima os segundos atuais no formato: "After tick: {seconds}"
    
    // TODO: Chame timer_reset para resetar o timer
    
    // TODO: Imprima os segundos novamente no formato: "After reset: {seconds}"
    
    return 0;
}
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Programação Orientada a Objetos

Pratique por conta própria: Compilador de C online