Istanziare oggetti dentro costruttore

di il
2 risposte

Istanziare oggetti dentro costruttore

class Ferro_stiro {

    // ATTRIBUTI
    int potenza;
    Serbatoio s;
    int ghiera;
    bool l_giallo;
    bool l_rosso;

	.....

	.....

	

	
public:

    // COSTRUTTORI
    Ferro_stiro() 
    {
        setPotenza(D_POWER);
        s = new Serbatoio(); // Serbatorio;
        setGhiera(MIN_GHIERA);
        Check_giallo();
        Check_rosso();
    }
    Ferro_stiro(int potenza, int capacita)
    {
        s = new Serbatoio(capacita); // Serbatoio s(capacita);
        setPotenza(potenza);
        setGhiera(MIN_GHIERA);
        Check_giallo();
        Check_rosso();
    }
    .......
};

Come faccio ad istanziare un oggetto dentro un costruttore?

Ho due costruttori per Ferro_stiro : in uno richiamo il costruttore di default di Serbatoio, in un altro il costruttore  Serbatoio con capacità.

Ma non mi funziona, cioè nel secondo caso mi richiama il serbatoio di default.

2 Risposte

  • Re: Istanziare oggetti dentro costruttore

    Se hai field di una classe con un costruttore di default non ti serve inizializzarli. Il costruttore verrà chiamato automaticamente.

    Se invece hai un costruttore specifico che vuoi utlizzare puoi usare questa sintassi nel costruttore:

    Ferro_stiro(int capacita_serbatoio) : serbatoio(capacita_serbatoio) {}

    dove serbatoio è un field della classe di tipo Serbatoio.

    Se invece hai field che sono puntatori (ma non è il tuo caso) puoi fare new.. ma non è consigliato nel c++ moderno, meglio utilizzare smart  pointer o evitare proprio i puntatori se possibile.

    Dai un occhiata qui: Constructors and member initializer lists

  • Re: Istanziare oggetti dentro costruttore

    07/01/2024 - zoro82 ha scritto:


    Ma non mi funziona, cioè nel secondo caso mi richiama il serbatoio di default.

    Quando si istanzia un oggetto di una generica classe, per prima cosa verranno “creati” gli eventuali attributi (nell'ordine in cui sono dichiarati nella definizione della classe) e poi verrà eseguito l'eventuale codice relativo al costruttore.

    Detto ciò, dal momento che la classe Ferro_stiro contiene tra i propri attributi un oggetto della classe Serbatoio, è ovvio che venga richiamato il costruttore di default Serbatoio() prima ancora di eseguire le istruzioni relative al costruttore di Ferro_stiro.

    Se poi vuoi “costruire” l'attributo s con un costruttore diverso da quello di default, come detto anche da @fededevi, l'unico modo è utilizzare una lista di inizializzazione:

    Ferro_stiro(int potenza, int capacita) : s(capacita)
    {
        ...
    }

    In ogni caso vale la pena sottolineare che l'esempio che hai riportato non ha molto senso e che quel codice non potrebbe mai compilare, in quanto new ritorna un puntatore ed s non sembra esserlo… 
    Magari se ci dici cosa stai cercando di fare e cosa intendi con “istanziare un oggetto dentro un costruttore” possiamo esserti maggiormente d'aiuto.

Devi accedere o registrarti per scrivere nel forum
2 risposte