Pregunta

Dada la muestra de código:

class B {
    //Some contents.
};

class C {
    private:
        B& b;
};

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

La clase C tiene una referencia a AB, por lo que debe inicializarse con él. La clase A contiene una instancia de B y una instancia de C.

Mi pregunta es: ¿Puedo inicializar la instancia C en A con la instancia B en A (suponiendo que me molestara en poner a los constructores)? En segundo lugar, ¿necesito realizar alguna inicialización explícita de la B en A, o se inicializa por defecto ya que es un tipo de clase dentro de una clase?

¿Fue útil?

Solución

Las variables de los miembros se inicializan en el orden de que se declaran en la declaración de clase (Incluso si los tiene en un orden diferente en la lista de inicialización del constructor), así que sí, para el momento c está siendo inicializado, b se inicializará y puede usar b Para inicializar c.

Como señala Ricardo Cardenes, seguirá funcionando incluso si declara c antes de b en la definición de clase (lo que significa que pasará C::C una referencia a un no inicializado B) Sin embargo, causas un comportamiento indefinido si usar el objeto interior C::C. Es más seguro declarar b Primero, porque aunque no puedas usar b en el interior C::C Ahora, podría en el futuro y olvidar que la referencia se refiere a un B, y causar ub.

Y no, no tienes que inicializar explícitamente b (a menos que sea VAINA) a menos que no quiera que se construya por defecto. Entonces este código sería lo que quieres (de nuevo, si B no es pod):

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

Otros consejos

A su primera pregunta: puede inicializarlo escribiendo constructores como este:

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

Por supuesto, si su constructor de C realmente usa b (en lugar de solo su dirección), debe asegurarse de que el orden de inicialización permanezca igual, por lo tanto b debe ser declarado antes c, dado que los miembros se inicializan en el orden en el que se declaran (incluso si la lista de inicialitos los pone en un orden diferente).

Y no, no necesita inicializar explícitamente B, ya que se construirá por defecto si no lo hace. Por supuesto, si B es una cápsula, esto significa permanecer no inicializado (mientras lo inicializa explícitamente usando b() en la lista inicializadora de A() lo inicializaría para 0).

¿Puedo inicializar la instancia C en A con la instancia B en A (suponiendo que me molesté en poner los constructores)?

Por supuesto.

En segundo lugar, ¿necesito realizar alguna inicialización explícita de la B en A, o se inicializa por defecto ya que es un tipo de clase dentro de una clase?

No, esta bien.

Sí, dado que C solo contiene una referencia a una B y no a una instancia separada, puede poner un constructor en C y dejar que ACB haga referencia AB

B y C dentro de A están instanciados/construidos automáticamente cuando crea una instancia de A.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top