elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Como proteger una cartera - billetera de Bitcoin


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Problema al crear arreglos de objetos en C++
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Problema al crear arreglos de objetos en C++  (Leído 8,019 veces)
DarkSorcerer

Desconectado Desconectado

Mensajes: 69



Ver Perfil
Problema al crear arreglos de objetos en C++
« en: 15 Septiembre 2013, 12:45 pm »

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

Código:
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
  1. #include "Persona.h"
  2. #include <string>
  3. #include <iostream>
  4.  
  5. using namespace std;
  6.  
  7. Persona::Persona(string n, string r, int e) {
  8.  
  9.    nombre = n;
  10.    rut = r;
  11.    edad = e;
  12.  
  13. }
  14.  
  15. Persona::Persona(const Persona& orig) {
  16. }
  17.  
  18. Persona::Persona(){
  19.  
  20. }
  21.  
  22. Persona::~Persona() {
  23.  
  24.    cout <<"\nBorrando datos ...";
  25.  
  26. }
  27.  
  28. string Persona::getNombre(){
  29.  
  30.    return nombre;
  31.  
  32. }
  33.  
  34. string Persona::getRut(){
  35.  
  36.    return rut;
  37.  
  38. }
  39.  
  40. int Persona::getEdad(){
  41.  
  42.    return edad;
  43.  
  44. }
  45.  
  46.  

Código
  1. #ifndef PERSONA_H
  2. #define PERSONA_H
  3. #include <string>
  4.  
  5. using namespace std;
  6.  
  7. class Persona {
  8. public:
  9.    Persona(string nom, string r, int e);
  10.    Persona();
  11.    Persona(const Persona& orig);
  12.    virtual ~Persona();
  13.    string getNombre();
  14.    string getRut();
  15.    int getEdad();
  16. private:
  17.    string nombre;
  18.    string rut;
  19.    int edad;
  20. };
  21.  
  22. #endif /* PERSONA_H */
  23.  
  24.  

Código
  1. #include <cstdlib>
  2. #include <iostream>
  3. #include "Persona.h"
  4.  
  5. using namespace std;
  6.  
  7. void desplegarDatos(Persona *arreglo){
  8.  
  9.    cout <<"\n\nDesplegando datos de las personas\n\n";
  10.  
  11.    for(int i=0; i<3; i++){
  12.  
  13.        cout <<"\nNombre: " << arreglo[i].getNombre();
  14.        cout <<"\nRut: " << arreglo[i].getRut();
  15.        cout <<"\nEdad: " << arreglo[i].getEdad();
  16.        cout <<"\n";
  17.  
  18.    }
  19.  
  20. }
  21.  
  22. int main(int argc, char** argv) {
  23.  
  24.    cout <<"Creando un arreglo de 3 personas";
  25.  
  26.    Persona *personas = new Persona[3];
  27.  
  28.    personas[0] = Persona("Rodrigo","132-K",23);
  29.    personas[1] = Persona("Francisco","342-L",20);
  30.    personas[2] = Persona("Samuel","345-P",21);
  31.  
  32.    desplegarDatos(personas);
  33.  
  34.    delete []personas;
  35.  
  36.    return 0;
  37. }
  38.  
  39.  


En línea

amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: Problema al crear arreglos de objetos en C++
« Respuesta #1 en: 15 Septiembre 2013, 15:18 pm »

Código
  1. personas[0] = Persona("Rodrigo","132-K",23);
  2. personas[1] = Persona("Francisco","342-L",20);
  3. 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.



En línea

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


Desconectado Desconectado

Mensajes: 3.034



Ver Perfil
Re: Problema al crear arreglos de objetos en C++
« Respuesta #2 en: 15 Septiembre 2013, 19:05 pm »

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
En línea


Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Ayuda con un problema de arreglos en C.
Programación C/C++
noidroid 1 2,036 Último mensaje 26 Noviembre 2013, 06:04 am
por ThePinkPanther
Crear dos vectores/arrays/arreglos con los datos de uno
Java
Browwwnnn 6 3,598 Último mensaje 22 Octubre 2014, 19:22 pm
por Browwwnnn
Problema al crear objetos con método switch
Java
Finishim 3 3,549 Último mensaje 14 Junio 2015, 11:57 am
por robertofd1995
tengo un problema conestructuras con arreglos !!!!
Programación C/C++
matrixsystem 2 2,090 Último mensaje 15 Diciembre 2015, 06:39 am
por matrixsystem
crear 5 objetos con caracteristicas ya definidas aleatoriamente
Java
sheiking 2 2,549 Último mensaje 29 Octubre 2018, 02:04 am
por sheiking
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines