Problema al crear arreglos de objetos en C++

Iniciado por DarkSorcerer, 15 Septiembre 2013, 12:45 PM

0 Miembros y 1 Visitante están viendo este tema.

DarkSorcerer

Primero que nada, soy novato en C++, espero poder surgir con la ayuda :D

Bueno, resulta que estoy practicando lo que he aprendido en C++, aun tengo que dominar los punteros y la asignacion dinamica. Tambien en la creacion de arreglos, donde les explicare mi problema.

Cree una clase llamada "Persona", que tiene como atributos su nombre, su rut (en mi pais se refiere al numero de identificacion) y la edad.

Yo quiero crear un arreglo de personas, desde el main creo 3 personas y ademas, llamo a un metodo para que imprima los datos de cada persona, me funciona, pero no exactamente como queria, en el destructor yo implemente de tal manera que imprimiera un mensaje que confirmara que se esta borrando cada vez que se usa delete, es aqui donde sale mi problema, una vez que llene mi arreglo con personas, mando el arreglo a la funcion "desplegarDatos" para que imprimiera los datos de cada persona, pero me sale lo que escribi en el destructor justo al llamar a imprimir el arreglo, y ya cuando termino de imprimir, vuelve a imprimir el mensaje del destructor

¿ por que se imprimio al principio "borrando datos..." si no llame a delete, si el delete lo llamo cuando terminara de imprimir ?

Esto es lo que me sale en la ventana de comandos

Creando un arreglo de 3 personas
Borrando datos ...
Borrando datos ... // ¿ Por que sale esto al principio cuando deberia ser al final ?
Borrando datos ...

Desplegando datos de las personas


Nombre: Rodrigo
Rut: 132-K
Edad: 23

Nombre: Francisco
Rut: 342-L
Edad: 20

Nombre: Samuel
Rut: 345-P
Edad: 21

Borrando datos ...
Borrando datos ...
Borrando datos ...
RUN SUCCESSFUL (total time: 703ms)


Ahora lees dejo mi codigo

Código (cpp) [Seleccionar]
#include "Persona.h"
#include <string>
#include <iostream>

using namespace std;

Persona::Persona(string n, string r, int e) {
   
    nombre = n;
    rut = r;
    edad = e;
   
}

Persona::Persona(const Persona& orig) {
}

Persona::Persona(){
   
}

Persona::~Persona() {
   
    cout <<"\nBorrando datos ...";
   
}

string Persona::getNombre(){
   
    return nombre;
   
}

string Persona::getRut(){
   
    return rut;
   
}

int Persona::getEdad(){
   
    return edad;
   
}



Código (cpp) [Seleccionar]
#ifndef PERSONA_H
#define PERSONA_H
#include <string>

using namespace std;

class Persona {
public:
    Persona(string nom, string r, int e);
    Persona();
    Persona(const Persona& orig);
    virtual ~Persona();
    string getNombre();
    string getRut();
    int getEdad();
private:
    string nombre;
    string rut;
    int edad;
};

#endif /* PERSONA_H */



Código (cpp) [Seleccionar]
#include <cstdlib>
#include <iostream>
#include "Persona.h"

using namespace std;

void desplegarDatos(Persona *arreglo){
   
    cout <<"\n\nDesplegando datos de las personas\n\n";
   
    for(int i=0; i<3; i++){
       
        cout <<"\nNombre: " << arreglo[i].getNombre();
        cout <<"\nRut: " << arreglo[i].getRut();
        cout <<"\nEdad: " << arreglo[i].getEdad();
        cout <<"\n";
       
    }
   
}

int main(int argc, char** argv) {
   
    cout <<"Creando un arreglo de 3 personas";
   
    Persona *personas = new Persona[3];
   
    personas[0] = Persona("Rodrigo","132-K",23);
    personas[1] = Persona("Francisco","342-L",20);
    personas[2] = Persona("Samuel","345-P",21);
   
    desplegarDatos(personas);
   
    delete []personas;

    return 0;
}



amchacon

Código (cpp) [Seleccionar]
personas[0] = Persona("Rodrigo","132-K",23);
personas[1] = Persona("Francisco","342-L",20);
personas[2] = Persona("Samuel","345-P",21);


Estás usando lo que se conoce como "move constructor". Es decir, cambias la referencia del objeto a otro nuevo (borrando el anterior).

Es un sistema factible, y quizás sea lo más comodo en este caso.

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

dato000

Espera, dejame entenderlo (y explicarlo un poco para ver si lo entendi bien) en español XD siguiendo el detalle especificado por amchacon

Lo que haces es este proceso, creo:

1) Creas un constructor con los datos "nombre persona", "string rut", "int edad"
2) Estas reservando una espacio de memoria (No se si estas reservando memoria dinamica, ya que estas usando el destructor virtual)
3) Creas un arreglo de personas apuntando a un espacio de memoria (al ser objetos, nuevamente no estoy seguro si reservas memoria dinamica)
4) Asignas ese constructor a una posición del arreglo del mismo tipo persona con los datos de cada persona
5) Cuando se asigna la posición y los datos en la misma, invocas al destructor, para eliminar los datos del constructor, se realiza de forma automatica para despejar memoria
6) Cuando invocas el constructor se envia el mensaje "borrando datos"
7) Realizas la asignación nuevamente...
8) LLamas a la función "desplegarDatos" que pues, toma el arreglo y usas un ciclo repetitivo para mandar el mensaje con la info de cada persona en tu arreglo
9) usas el delete para borrar cada objeto persona que se guarda en cada posición.
10) return 0 ---> salida del programa

Pues creo que la cosa es así, no se si te ayude un poco a entender el funcionamiento de tu programa, así es como veo esa prueba de escritorio  :silbar: :silbar:

Lo que no se es como hacer que te mande esos primeros mensajes, tal vez necesites asignar un destructor con un dato (se puede hacer eso?? nunca lo he intentado, de hecho, nunca uso destructores XD) y en el caso que uses el delete pues use ese destructor configurado con el dato, tal vez un booleano o un entero para diferenciarlo del destructor por defecto, que es el que se llama al principio cuando asignas los datos en la posición del arreglo.

slds