Domanda

Dato il codice di esempio:

class B {
    //Some contents.
};

class C {
    private:
        B& b;
};

class A {
    private:
        B b;
        C c;
};

Classe C ha un riferimento ad un B, quindi ha bisogno di essere inizializzato con esso. Classe A contiene un'istanza di B e un'istanza di C.

La mia domanda è: posso inizializzare l'istanza C in A con l'istanza di B in A (supponendo che mi preoccupai di mettere i costruttori a)? In secondo luogo, ho bisogno di eseguire qualsiasi inizializzazione esplicita della B in A, o è predefinita inizializzato fin dalla sua un tipo di classe all'interno di una classe?

È stato utile?

Soluzione

variabili membro sono inizializzate nell'ordine in cui sono dichiarate nella dichiarazione della classe (, anche se li avete in un ordine diverso nella lista di inizializzazione del costruttore ), quindi sì, per il momento c viene inizializzato, b verrà inizializzato, ed è possibile utilizzare b per c inizializzazione.

note come Ricardo Cardenes, esso continuerà a funzionare, anche se si dichiara c prima b nella definizione della classe (il che significa che si passa C::C un riferimento a un B Non inizializzato), tuttavia si causa un comportamento indefinito se uso l'oggetto all'interno C::C. E 'più sicuro di dichiarare b primo luogo, perché anche se non è possibile utilizzare b all'interno C::C Ora, si potrebbe in futuro e dimenticare che il riferimento si riferisce ad un B Non inizializzato, e la causa UB.

E no, non c'è bisogno di b esplicitamente inizializzazione (a meno che sia POD ) a meno che non si vuole che sia default-costruito. Quindi questo codice sarebbe quello che si vuole (ancora una volta, se non è B POD):

A::A() : c(b) { }

Altri suggerimenti

Per la tua prima domanda: è possibile inizializzare scrivendo costruttori in questo modo:

C::C(B& bInst): b(bInst){}
A::A():b(), c(b) {}

Naturalmente se il costruttore della C utilizza effettivamente b (invece di solo il suo indirizzo), è necessario assicurarsi che i soggiorni di ordine di inizializzazione stesso, in modo da b deve essere dichiarato prima del c, poiché i membri sono inizializzati nell'ordine in cui sono dichiarato (anche se la lista initializaiton li mette in un ordine diverso).

E no non è necessario in modo esplicito inizializzazione B, dal momento che sarà di default costruito se non lo fai. Naturalmente se B è un POD questo mezzo rimanenti è inizializzata (mentre esplicitamente inizializzazione utilizzando b() nella lista di inizializzazione di A() sarebbe inizializzarlo a 0).

Posso inizializzare l'istanza C in A con l'istanza di B in A (supponendo che si sono preoccupati di mettere i costruttori a)

Certo.

In secondo luogo, ho bisogno di eseguire qualsiasi inizializzazione esplicita della B in A, o è predefinita inizializzato fin dalla sua un tipo di classe all'interno di una classe?

No, va bene.

Sì, in quanto C contiene solo un riferimento ad un B e non un'istanza separata, si può mettere un costruttore in C e lasciare a.b riferimento A.C.b.

B e C all'interno A sono entrambi istanziati / costruito automaticamente quando si crea un'istanza di A.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top