2012-06-20 7 views
5

Mi piacerebbe sapere se questi sono praticamente la stessa cosa.Passare i riferimenti a un costruttore C++ e salvarli su tipi di riferimento o non di riferimento

class ExampleClass { 
    public: 
     ExampleClass(Object& newObj) : obj(newObj) {} 
    private: 
     Object obj; 
} 

class ExampleClass2 { 
    public: 
     ExampleClass2(Object& newObj) : objReference(newObj) {} 
    private: 
     Object& objReference; 
} 

Quindi questo non funziona con nessuna delle classi?

ExampleClass* getExampleObject() { 
    Object obj; 
    return new ExampleClass(obj); 
} 

ExampleClass2* getExample2Object() { 
    Object obj; 
    return new ExampleClass2(obj); 
} 

void main() { 
    ExampleClass* ec = getExampleObject(); 
    ExampleClass2* ec2 = getExample2Object(); 
    //Do something involving the member objects of ec and ec2 
} 

Così sono il membro oggetti non validi dopo che entrambi i metodi getExampleObject? Il costruttore di ExampleClass non salva una copia dell'oggetto a cui fa riferimento il suo costruttore?

+1

il codice non viene compilato, poiché non è possibile assegnare i puntatori (restituiti da getExampleObject e getExample2Object) alle variabili non puntatore ec ed ec2. – SirDarius

+0

Sì, mi dispiace, ho dimenticato il * s. – user1468729

risposta

8

ExampleClass va bene, in quanto richiede una copia dell'oggetto a cui fa riferimento l'argomento del costruttore.

ExampleClass2 richiede che l'oggetto a cui fa riferimento l'argomento del costruttore esiste per la durata dell'istanza ExampleClass2 (poiché memorizza un riferimento all'oggetto, non lo copia). In caso contrario, l'istanza ExampleClass2 avrà un riferimento ciondolante non appena l'oggetto a cui fa riferimento viene distrutto. Questo è il caso con la funzione getExample2Object() come obj viene distrutta quando restituisce getExample2Object().

+1

Grazie. Questo è quello che pensavo ma questo mi ha fatto dubitare di me stesso: [link] (http://stackoverflow.com/questions/1404305/c-reference-in-constructor) – user1468729

+0

@ user1468729, in quella domanda 'myclass' ha' std :: membro stringa', non un riferimento a 'std :: string'. – hmjd

+0

Così fa il mio primo ExampleClass. O mi sto perdendo qualcosa qui? – user1468729

0

Mi piacerebbe sapere se sono sostanzialmente la stessa cosa.

No, non lo sono. Il costruttore di Example prende un riferimento a un oggetto e costruisce un oggetto membro per utilizzare l'oggetto passato. Questo oggetto non è un riferimento ma una copia. Nel caso di Example2, si sta effettivamente facendo objReference riferimento all'oggetto passato nel parametro di ctor. Sei bravo solo finchè la vita di newObj.

Il

Object obj; 
return new ExampleClass2(obj); 

è il classico caso in cui fallirà. Una volta che la funzione ritorna, avrai un riferimento ciondolante.

Problemi correlati