2012-06-20 18 views
5

Me gustaría saber si son básicamente lo mismo.Pasar referencias a un constructor C++ y guardarlos en tipos de referencia o no referencia

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

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

¿No funcionaría esto con alguna de las clases?

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 
} 

también lo son los miembros objetos no válidos después de que ambos métodos getExampleObject? ¿El constructor de ExampleClass no guarda una copia del objeto al que se hace referencia en su constructor?

+1

su código no se compila, ya que no puede asignar punteros (como los devueltos por getExampleObject y getExample2Object) a las variables no puntero ec y ec2. – SirDarius

+0

Sí, lo siento, olvidé el *. – user1468729

Respuesta

8

ExampleClass está bien, ya que toma una copia del objeto al que se hace referencia en su argumento de constructor.

ExampleClass2 requiere que el objeto al que se hace referencia en su argumento constructor exista durante el tiempo de vida de la instancia ExampleClass2 (ya que almacena una referencia al objeto, no lo copia). Si no lo hace, la instancia ExampleClass2 tendrá una referencia colgante tan pronto como se destruya el objeto al que se refiere. Este es el caso con la función getExample2Object() ya que obj se destruye cuando devuelve getExample2Object().

+1

Gracias. Eso es lo que pensé, pero esto me hizo dudar de mí mismo: [link] (http://stackoverflow.com/questions/1404305/c-reference-in-constructor) – user1468729

+0

@ user1468729, en esa pregunta 'myclass' tiene' std :: string' member, no una referencia a 'std :: string'. – hmjd

+0

Lo mismo ocurre con mi primer ExampleClass. ¿O me estoy perdiendo algo aquí? – user1468729

0

Me gustaría saber si son básicamente lo mismo.

No, no lo son. El constructor Example toma una referencia de objeto y construye un objeto miembro para usar el objeto pasado. Este objeto no es una referencia sino una copia. En el caso de Example2, en realidad está haciendo objReference consulte el objeto pasado en el parámetro de ctor. Usted es bueno solo mientras dure newObj.

El

Object obj; 
return new ExampleClass2(obj); 

es el caso clásico cuando se producirá un error. Una vez que la función regrese, tendrá una referencia colgante.

Cuestiones relacionadas