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.

No se puede devolver un vector de objetos en una función debido a los destructores.

Estoy teniendo problemas al devolver vectores de objetos de una clase en funciones porque cada vez que mi destructor borra los datos dos veces y todo el código simplemente se detiene cuando la función termina.

Aquí hay un código simple que escribí para mostrar mi problema:

#include <iostream>
#include <vector>

using namespace std;

class identity{
public:
    string name;
    identity(string Name);
    ~identity();
};

vector<identity> function();

int main(){
    function();
    cout << "¡Hola mundo!";
}

identity::identity(string Name)
    : name{Name}{
        cout << "¡Objeto creado!" << endl;
    }

identity::~identity(){
    cout << "¡Objeto " << name << " destruido!" << endl;
}

vector<identity> function(){
    identity me("Isaias");
}

En este caso, el cout “¡Hola mundo!” no funciona y el programa siempre termina con “¡Objeto” sin mostrar el nombre, así:

Objeto creado!
Objeto Isaias destruido!
Objeto

y luego el programa se detiene. Arreglé el problema estableciendo el tipo de la función como “void” o cualquier otro en lugar de “vector“, pero me gustaría saber por qué ocurre este problema. Además, soy nuevo en la programación en general y en esta comunidad, así que lamento si no estoy haciendo esto de la manera correcta.

Me gustaría agradecerles a todos por su atención antes que nada y nuevamente lamento si estoy arruinando todo aquí.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema con el código es que la función function() está declarada para devolver un vector de objetos de la clase identity, pero en realidad no se devuelve ningún vector al final de la función. Esto provoca que se llame al destructor del objeto identity llamado me cuando la función termina, por eso se imprime la línea “¡Objeto Isaias destruido!”.

    Para solucionar este problema, simplemente puedes crear un vector de objetos identity dentro de la función y devolverlo al final, de la siguiente manera:

    vector<identity> function(){
        vector<identity> identities;
        identities.push_back(identity("Isaias"));
        return identities;
    }
    

    De esta forma, el destructor del objeto identity (o los objetos, si hay más de uno) solo se llamará cuando el vector quede fuera de alcance (es decir, cuando sea destruido), por lo que no verás el mensaje “¡Objeto Isaias destruido!” hasta el final del programa.

    En cuanto a por qué cambiar el tipo de retorno de la función soluciona el problema, probablemente se debe a que si la función no devuelve nada (es decir, si retorna void), no quedan objetos de tipo identity en el alcance de la función cuando esta termina, por lo que no es necesario llamar a su(s) destructor(es) nuevamente.

Comments are closed.