Menu
Coddy logo textTech

Metodi e variabili statici

Fa parte della sezione Programmazione orientata agli oggetti del percorso C++ di Coddy. Lezione 31 di 104.

Hai imparato che i membri statici sono condivisi tra tutti gli oggetti. Ora esploriamo come definire e usare correttamente i metodi statici insieme alle variabili statiche.

Le variabili statiche dichiarate all'interno di una classe devono essere definite all'esterno della classe, in genere in un file sorgente. Questo perché i membri statici necessitano di una sola posizione di memoria condivisa da tutti gli oggetti:

class Counter {
    static int count;    // Solo dichiarazione
    
public:
    Counter() { count++; }
    ~Counter() { count--; }
    
    static int getCount() {    // Metodo statico
        return count;
    }
};

// Definizione - necessaria all'esterno della classe
int Counter::count = 0;

Un metodo statico appartiene alla classe, non a un oggetto. Questo ha una conseguenza importante: i metodi statici non possono accedere ai membri di istanza né usare il puntatore this, perché non vengono chiamati su un oggetto specifico.

class MathUtils {
    static double pi;
    
public:
    static double circleArea(double radius) {
        return pi * radius * radius;    // Può accedere ai membri statici
    }
};

double MathUtils::pi = 3.14159;

// Chiamato senza un oggetto
double area = MathUtils::circleArea(5.0);

I metodi statici sono ideali per le funzioni di utilità che non hanno bisogno dello stato di un oggetto, per i metodi factory che creano oggetti o per accedere ai dati statici. Poiché non richiedono un'istanza di un oggetto, li chiami usando il nome della classe e l'operatore di risoluzione dell'ambito: ClassName::methodName().

challenge icon

Sfida

Facile

Creiamo un sistema di generazione di ID univoci che dimostri come i metodi e le variabili statici lavorino insieme per fornire funzionalità a livello di classe senza dover creare istanze di oggetti.

Creerai due file per organizzare il codice:

  • IDGenerator.h: Definisci una classe IDGenerator che genera ID univoci sequenziali. La classe deve avere:
    • Un membro statico privato nextId che tiene traccia del prossimo ID da assegnare (inizia da 1000)
    • Un membro statico privato prefix (stringa) che memorizza un prefisso personalizzabile per tutti gli ID
    • Un metodo statico setPrefix(const std::string& p) che modifica il prefisso
    • Un metodo statico getNextId() che restituisce una stringa che combina il prefisso e il numero dell'ID corrente, quindi incrementa nextId per la chiamata successiva
    • Un metodo statico peekNextId() che restituisce quello che sarebbe il prossimo ID senza incrementare il contatore
    • Un metodo statico getGeneratedCount() che restituisce quanti ID sono stati generati (suggerimento: calcola la differenza tra il valore iniziale e il valore corrente di nextId)
    • Un metodo statico reset() che reimposta nextId a 1000

    Ricordati di definire i membri statici fuori dalla classe, dopo la definizione della classe. Inizializza prefix a "ID-".

  • main.cpp: Dimostra come chiamare i metodi statici usando il nome della classe senza creare oggetti. Leggi un prefisso personalizzato dall'input, poi:
    • Stampa "Peek: <peeked_id>" usando peekNextId()
    • Genera tre ID usando getNextId() e stampa ciascuno nel formato "Generated: <id>"
    • Stampa "Count: <count>" mostrando quanti ID sono stati generati
    • Modifica il prefisso usando il valore di input con setPrefix()
    • Genera altri due ID e stampa ciascuno nel formato "Generated: <id>"
    • Stampa di nuovo "Count: <count>"
    • Chiama reset()
    • Stampa "After reset - Peek: <peeked_id>"
    • Stampa "After reset - Count: <count>"

Nota che non crei mai un oggetto IDGenerator: tutti i metodi vengono chiamati direttamente sulla classe usando IDGenerator::methodName(). Questa è la caratteristica fondamentale dei metodi statici: appartengono alla classe stessa, non a una particolare istanza.

Includi <string> e <iostream> nel file header e non dimenticare le protezioni dell'header.

Provalo tu

#include <iostream>
#include <string>
#include "IDGenerator.h"

using namespace std;

int main() {
    // Leggi il prefisso personalizzato dall'input
    string customPrefix;
    cin >> customPrefix;
    
    // TODO: Stampa "Peek: <peeked_id>" usando peekNextId()
    
    // TODO: Genera tre ID usando getNextId() e stampa ciascuno come "Generated: <id>"
    
    // TODO: Stampa "Count: <count>" per mostrare quanti ID sono stati generati
    
    // TODO: Cambia il prefisso usando il valore di input con setPrefix()
    
    // TODO: Genera altri due ID e stampa ciascuno come "Generated: <id>"
    
    // TODO: Stampa di nuovo "Count: <count>"
    
    // TODO: Chiama reset()
    
    // TODO: Stampa "After reset - Peek: <peeked_id>"
    
    // TODO: Stampa "After reset - Count: <count>"
    
    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