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.
Sfida
FacileCostruiamo 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 opacoScoreusando una dichiarazione anticipata (senza corpo della struct!). Dichiara queste funzioni:create_score: prende un intero per i punti iniziali e restituisce un puntatore a Scorefree_score: prende un puntatore a Score e libera la memoriascore_get_points: una funzione getter che prende unconst Score *e restituisce i punti attualiscore_set_points: una funzione setter che prende unScore *e un intero, aggiornando il valore dei punti
SCORE_H.score.c: definisci lastruct Scoreeffettiva 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 puntatoriconst, 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}
FreedPer esempio, con gli input 100 e 250, l'output sarebbe:
Initial: 100
Updated: 250
FreedNota 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;
}
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
1Basi di programmazione modulare
File di intestazioneGuardie di inclusioneFile sorgenteFunzioni staticheRipasso: calcolatrice modulare4Incapsulamento
Il concetto di puntatori opachiDefinire struct opacheGetter e setterLa convalida nei setterRiepilogo: scatola segreta2Oggetti e metodi
Le struct come oggettiIl puntatore 'Self'Correttezza constPuntatore o valoreMetodi di supportoRiepilogo: gestore di punti5Progetto: Conto bancario semplice
Configurazione del progettoImplementazione del conto8Polimorfismo
Puntatori a funzione nelle structSimulare i metodiIl concetto di interfacciaImplementare le interfacceIterazione polimorficaRiepilogo: Greeter11Pattern di progettazione in C
Pattern SingletonPattern FactoryPattern IteratorRiepilogo: Factory di Logger3Ciclo di vita degli oggetti
Pattern del costruttorePattern del distruttoreInizializzazione sullo stackCopia profondaRiepilogo: wrapper di stringhe6Ereditarietà tramite composizione
Incorporamento delle structLa regola del primo membroAccesso ai membri della classe baseUpcastingRiepilogo: gerarchia di forme9Progetto: Disegnatore di forme
Panoramica del progettoImplementazione del cerchioImplementazione del rettangoloUtilizzo polimorficoContenitore di formeEsercitati da solo: Compilatore C online