Menu
Coddy logo textTech

Costruttori deleganti

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

Quando hai più costruttori che condividono una logica di inizializzazione comune, puoi usare i costruttori deleganti per evitare la duplicazione del codice. Un costruttore delegante chiama un altro costruttore della stessa classe nella sua lista di inizializzazione.

class Player {
    std::string name;
    int health;
    int level;
public:
    // Costruttore principale - svolge il lavoro effettivo
    Player(std::string n, int h, int lvl) 
        : name(n), health(h), level(lvl) {}
    
    // Delega al costruttore principale
    Player(std::string n) : Player(n, 100, 1) {}
    
    // Anche il costruttore predefinito delega
    Player() : Player("Unknown") {}
};

La delega avviene nella lista di inizializzazione usando il nome della classe seguito dagli argomenti. Quando viene chiamato Player(), delega a Player(std::string), che a sua volta delega al costruttore con tre parametri. La catena viene eseguita dal costruttore di destinazione fino a quello originale.

C'è una regola importante: un costruttore delegante non può avere altri membri nella sua lista di inizializzazione. La delega deve essere l'unico elemento:

class Item {
    int id;
    int value;
public:
    Item(int i, int v) : id(i), value(v) {}
    
    // Errore! Non è possibile combinare la delega con l'inizializzazione dei membri
    // Item(int i) : Item(i, 0), id(i) {}
    
    // Corretto: solo delega
    Item(int i) : Item(i, 0) {}
};

I costruttori deleganti aiutano a centralizzare la logica di inizializzazione in un unico punto, rendendo il codice più facile da mantenere e meno soggetto a errori dovuti alla duplicazione del codice.

challenge icon

Sfida

Facile

Creiamo un sistema di impostazioni di connessione che dimostri come i costruttori deleganti possano eliminare la duplicazione del codice concatenando le chiamate ai costruttori.

Creerai due file per organizzare il codice:

  • Connection.h: definisci una classe Connection che rappresenta una connessione di rete con varie opzioni di configurazione. La classe deve avere:
    • Membri privati: host (stringa), port (int), timeout (int in secondi) e secure (bool)
    • Un costruttore principale che accetta tutti e quattro i parametri e inizializza tutti i membri usando una lista di inizializzazione. Questo costruttore deve stampare "Connection configured: <host>:<port>"
    • Un costruttore che accetta solo host e port e delega al costruttore principale, impostando timeout su 30 e secure su false come valori predefiniti
    • Un costruttore che accetta solo host e delega al costruttore con due parametri, impostando port su 80 come valore predefinito
    • Un costruttore predefinito che delega al costruttore con un parametro, impostando host su "localhost" come valore predefinito
    • Un metodo getInfo() che restituisce una stringa nel formato: "<host>:<port> (timeout: <timeout>s, secure: <yes/no>)"
  • main.cpp: mostra la catena di delega creando connessioni con diversi costruttori. Leggi dall'input un nome host e un numero di porta (ciascuno su una riga separata), poi:
    • Crea una Connection usando il costruttore predefinito
    • Crea una Connection usando solo l'host dell'input
    • Crea una Connection usando sia l'host sia la porta dell'input
    • Crea una Connection con l'host dell'input, la porta dell'input, un timeout di 60 e secure impostato su true
    • Stampa getInfo() per ciascuna connessione, una per riga

La catena di delega funziona così: il costruttore predefinito chiama il costruttore con un parametro, che chiama quello con due parametri, che a sua volta chiama il costruttore principale con quattro parametri. Ciò significa che il messaggio "Connection configured" viene stampato una volta per ogni oggetto creato, sempre dal costruttore principale.

Per lo stato di sicurezza in getInfo(), stampa "yes" se secure è true, altrimenti "no".

Includi il file header in main.cpp usando #include "Connection.h".

Provalo tu

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

using namespace std;

int main() {
    // Leggi l'input
    string host;
    int port;
    cin >> host;
    cin >> port;

    // TODO: Crea una Connection usando il costruttore predefinito

    // TODO: Crea una Connection usando solo host dall'input

    // TODO: Crea una Connection usando sia host sia port dall'input

    // TODO: Crea una Connection con host e port dall'input, timeout=60 e secure=true

    // TODO: Stampa getInfo() per ogni connessione, una per riga

    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