- Comprendere il ruolo dei Setter nella protezione dell'integrità dell'oggetto
- Saper implementare logiche di controllo (validazione) all'interno dei Setter
- Distinguere tra assegnazione diretta e modifica controllata
- Gestire gli errori di input tramite messaggi di feedback all'utente
I Metodi Setter: Il Filtro di Sicurezza
Il Setter è un metodo pubblico che permette di cambiare il valore di un attributo privato. La sua importanza non risiede solo nel "cambiare il valore", ma nel controllare che il nuovo valore sia sensato.
Il rischio dell'accesso diretto
Se l'attributo prezzo fosse pubblico, un utente potrebbe scrivere nel main: ogg.prezzo = -500;. Un prezzo negativo romperebbe la logica del nostro distributore!
Il Setter ci permette di scrivere: "Accetta il nuovo prezzo solo se è maggiore di zero, altrimenti scarta la modifica".
| Caratteristica | Dettaglio Tecnico |
|---|---|
| Tipo di Ritorno | Solitamente è void (non deve restituire nulla, deve solo agire). |
| Nome Convenzionale | Si usa il prefisso set seguito dal nome dell'attributo (es. setPrezzo()). |
| Parametri | Richiede sempre un parametro dello stesso tipo del dato da modificare. |
Il Personaggio di un Videogioco
Nel Game Development, l'Incapsulamento garantisce che le regole del gioco siano rispettate.
Se un nemico ci colpisce, non deve poter scrivere eroe.salute = -50; deve invece chiamare un metodo che calcoli il danno e verifichi se il personaggio è ancora vivo.
Perché usare i Setter qui?
- Salute: Non può scendere sotto 0 e non può superare il valore massimo (es. 100).
- Livello: Può solo aumentare, mai diminuire.
- Nome: Non può essere una stringa vuota.
LABORATORIO
Sviluppo Hero Class
Obiettivo: Modellare un guerriero proteggendo i suoi parametri vitali tramite metodi di accesso controllato.
1 Definizione della Classe con Getter e Setter
Implementiamo la classe Guerriero. Nota come il Setter della salute agisce come uno "scudo" per i dati.
#include <iostream>
#include <string>
using namespace std;
class Guerriero {
private:
string nome;
int salute;
int livello;
public:
Guerriero(string n) {
nome = n;
salute = 100; // Valore iniziale predefinito
livello = 1;
}
// GETTER
string getNome() { return nome; }
int getSalute() { return salute; }
int getLivello() { return livello; }
// SETTER con Validazione
void setSalute(int nuovaSalute) {
if (nuovaSalute < 0) {
salute = 0;
cout << nome << " e' esausto (salute a 0)!" << endl;
} else if (nuovaSalute > 100) {
salute = 100;
} else {
salute = nuovaSalute;
}
}
void setLivello(int n) {
if (n > livello) { // Il livello può solo salire
livello = n;
cout << "LEVEL UP! " << nome << " ora e' al livello " << livello << endl;
}
}
};
2 Simulazione nel Main
Proviamo a "forzare" i dati e vediamo come i Setter mantengono l'integrità del personaggio.
int main() {
Guerriero eroe("Aragorn");
cout << "Eroe creato: " << eroe.getNome() << " | Salute: " << eroe.getSalute() << endl;
// Simuliamo un danno pesante
cout << "\n--- Combattimento in corso ---" << endl;
eroe.setSalute(eroe.getSalute() - 120); // Provo a scendere sotto zero
cout << "Salute attuale: " << eroe.getSalute() << endl;
// Simuliamo un Level Up
eroe.setLivello(2);
return 0;
}
3 Esercitazione Autonoma
Rendi il gioco più complesso con queste aggiunte:
- Mana (il Mana rappresenta la riserva di energia magica di un personaggio): Aggiungi un attributo privato
manae i relativi Getter/Setter. Il mana non può essere negativo. - Metodo Cura: Crea un metodo
cura(int punti)che usa il Setter della salute per aumentare i punti vita, senza superare 100. - Controllo Nome: Modifica il costruttore o crea un
setNome()che impedisca di assegnare nomi più corti di 3 caratteri.