Menu
Coddy logo textTech

Getter e setter

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

Con i puntatori opachi, i membri della struttura sono nascosti al codice esterno. Ma se il codice esterno non può accedere direttamente ai dati, come possiamo leggerli o modificarli? La risposta sono le funzioni getter e setter: interfacce pubbliche che forniscono un accesso controllato ai dati privati.

Un getter restituisce il valore di un membro nascosto:

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

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

Un setter modifica un membro nascosto:

// 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;
}

Nota la convenzione di denominazione: anteponi alle funzioni il nome del tipo (counter_) per evitare conflitti e rendere chiara l’API. I getter usano puntatori const perché non modificano l’oggetto.

Ora il codice esterno può interagire in sicurezza con i dati nascosti:

// 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

Questo schema ti dà il controllo completo su come si accede ai dati: una base su cui costruiremo nella prossima lezione, quando aggiungeremo la logica di convalida ai setter.

challenge icon

Sfida

Facile

Costruiamo un modulo Score che usa il modello del puntatore opaco con funzioni getter e setter. Creerai un gestore dei punteggi nascosto, con cui il codice esterno può interagire solo tramite l'interfaccia pubblica che fornisci.

Creerai tre file:

  • score.h: la tua interfaccia pubblica. Dichiara un tipo opaco Score usando una dichiarazione anticipata (senza corpo della struct!). Dichiara queste funzioni:
    • create_score: prende un intero per i punti iniziali e restituisce un puntatore a Score
    • free_score: prende un puntatore a Score e libera la memoria
    • score_get_points: una funzione getter che prende un const Score * e restituisce i punti attuali
    • score_set_points: una funzione setter che prende un Score * e un intero, aggiornando il valore dei punti
    Usa le guardie di inclusione con il simbolo SCORE_H.
  • score.c: definisci la struct Score effettiva con un solo membro nascosto: int points. Implementa tutte e quattro le funzioni. La funzione getter deve restituire il valore nascosto e la funzione setter deve aggiornarlo. Ricorda che i getter usano puntatori const, poiché non modificano l'oggetto.
  • main.c: mostra il funzionamento del modulo creando un punteggio, leggendone il valore, modificandolo tramite il setter e leggendolo di nuovo.

Riceverai due input: i punti iniziali (un intero) e il nuovo valore dei punti (un intero) da impostare.

Nel tuo file main, crea uno Score con i punti iniziali, stampa il valore attuale usando il getter, aggiornalo usando il setter con il nuovo valore, stampa il valore aggiornato, poi libera lo score e stampa una conferma.

Stampa l'output in questo formato:

Initial: {points}
Updated: {points}
Freed

Per esempio, con gli input 100 e 250, l'output sarebbe:

Initial: 100
Updated: 250
Freed

Nota che main.c non può accedere direttamente a points. Deve passare per le tue funzioni getter e setter. Questa è l'incapsulamento in azione: controlli esattamente come i dati nascosti possono essere letti e modificati.

Provalo tu

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

int main() {
    int initial_points, new_points;
    scanf("%d", &initial_points);
    scanf("%d", &new_points);
    
    // TODO: Crea un Score con initial_points
    
    // TODO: Stampa il valore iniziale usando il getter
    // Formato: "Initial: {points}"
    
    // TODO: Aggiorna il punteggio usando il setter con new_points
    
    // TODO: Stampa il valore aggiornato usando il getter
    // Formato: "Updated: {points}"
    
    // TODO: Libera la memoria del punteggio e stampa "Freed"
    
    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