Menu
Coddy logo textTech

Il puntatore 'Self'

Fa parte della sezione Programmazione orientata agli oggetti del percorso C di Coddy. Lezione 7 di 61.

Nei linguaggi orientati agli oggetti come Python o Java, quando chiami object.method(), il linguaggio passa automaticamente l’oggetto stesso al metodo. In C, dobbiamo farlo manualmente passando un puntatore alla struct come primo argomento.

Questo puntatore viene convenzionalmente chiamato self (preso in prestito da Python) o this (da C++). Consente alla funzione di accedere ai dati della struct per poterli leggere o modificare:

typedef struct {
    int health;
} Player;

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

Il puntatore self è ciò che fa sì che la funzione si comporti come un metodo. Sa quale giocatore modificare. Senza di esso, la funzione non avrebbe modo di accedere a quella specifica istanza della struct. Quando chiami questa funzione, passi l’indirizzo della tua struct:

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

Usare un puntatore (anziché passare direttamente la struct) è essenziale per apportare modifiche. Se passassi la struct per valore, la funzione riceverebbe una copia e tutte le modifiche andrebbero perse al ritorno della funzione. Il puntatore assicura che le modifiche persistano nella struct originale.

challenge icon

Sfida

Facile

Costruiamo un modulo Timer che tiene traccia dei secondi trascorsi. Ti eserciterai a usare il modello del puntatore "self" per modificare lo stato interno di una struct tramite funzioni che agiscono come metodi.

Creerai tre file:

  • timer.h: dichiara una struct Timer con un solo membro int seconds. Dichiara anche due funzioni: timer_tick (accetta un puntatore a Timer e aggiunge un numero specificato di secondi) e timer_reset (accetta un puntatore a Timer e reimposta i secondi a zero). Usa le protezioni di inclusione con il simbolo TIMER_H.
  • timer.c: implementa entrambe le funzioni. La funzione timer_tick deve accettare un Timer *self e un int amount, quindi aggiungere l'importo ai secondi del timer. La funzione timer_reset deve accettare un Timer *self e impostare i suoi secondi a zero.
  • main.c: crea un Timer, esegui delle operazioni su di esso e mostra i risultati.

Riceverai due input interi: i secondi iniziali del timer e la quantità da aggiungere tramite tick.

Nel file principale:

  1. Inizializza un Timer con il valore iniziale dei secondi
  2. Chiama timer_tick per aggiungere la quantità specificata
  3. Stampa i secondi correnti
  4. Chiama timer_reset per reimpostare il timer
  5. Stampa di nuovo i secondi (dovrebbero essere 0)

Stampa i risultati in questo formato:

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

Ad esempio, con un valore iniziale di 30 e aggiungendo 15 secondi, l'output sarebbe:

After tick: 45
After reset: 0

Provalo tu

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

int main() {
    int initial_seconds, amount_to_add;
    scanf("%d", &initial_seconds);
    scanf("%d", &amount_to_add);
    
    // TODO: Crea un Timer e inizializzalo con initial_seconds
    
    // TODO: Chiama timer_tick per aggiungere amount_to_add secondi
    
    // TODO: Stampa i secondi correnti nel formato: "After tick: {seconds}"
    
    // TODO: Chiama timer_reset per reimpostare il timer
    
    // TODO: Stampa di nuovo i secondi nel formato: "After reset: {seconds}"
    
    return 0;
}
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Compilatore C online