es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Orden de invocación del constructor para objetos miembro

Tengo la siguiente clase llamada Tree, que tiene un objeto miembro de la clase Leaf. Leaf requiere un parámetro de Tree (height_) para su construcción. Puedo escribir un método de inicialización para esto. Pero ¿conocemos el orden en el que se llaman los constructores, para que se cumplan las dependencias en la construcción de los objetos miembros cuando se construye la clase Tree?
En otras palabras, ¿cuando hay dependencia en la instanciación de un objeto miembro, es el único camino un método de inicialización separado (para el objeto miembro)?
Un código mínimo a continuación, he puesto un signo de interrogación en el argumento del constructor de Leaf para indicar mi pregunta:

class Tree {
    private:
    float height_;
    Leaf leaf_(?);
    public:
    explicit Tree(const std::istream& input);
};

void Tree::Tree(const std::istream& input){
    // leer height_ desde input
    ...
}

class Leaf {
    private:
    float height_fraction_;
    public:
    // height es requerido para la construcción de la clase Leaf
    Leaf(const float& height); 
};

void Leaf::Leaf(const float& height)
{
    height_fraction_ = 0.5 * height;
}
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Cuando hay una dependencia en la instanciación de un objeto miembro, podemos usar la lista de inicialización en el constructor de la clase Tree para asegurarnos de que el objeto Leaf se construya con el parámetro requerido. El orden en el que se llaman a los constructores se determina por el orden en el que se declaran los miembros de datos en la definición de la clase, no por el orden en el que aparecen en la lista de inicialización.

    Por lo tanto, podemos modificar la clase Tree para incluir la inicialización del objeto Leaf en la lista de inicialización de la siguiente manera:

    class Tree {
        private:
        float height_;
        Leaf leaf_;
        public:
        Tree(const float& input) : height_(input), leaf_(height_) {}
    };
    

    En esta clase Tree modificada, el miembro height_ se inicializa primero en la lista de inicialización, seguido por el miembro leaf_ que se construye usando el miembro height_. Esto asegura que el objeto Leaf se construya con el parámetro requerido antes de que el objeto Tree esté completamente construido.

    Por lo tanto, no necesitamos un método de inicialización separado para el objeto Leaf, siempre y cuando usemos correctamente la lista de inicialización en el constructor de la clase Tree.

Comments are closed.