Linguaggio C++

Metodi Setter

Approfondimento sui metodi Setter in C++: come modificare i dati privati in sicurezza. Focus sulla validazione dei dati e protezione dell'integrità dell'oggetto.

Durata

60 minuti

Software

Dev-C++ o Code::Blocks

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 mana e 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.





OOP, Setter, Incapsulamento, Validazione, C++,