Foros del Web » Programación para mayores de 30 ;) » C/C++ »

cómo listar stl de punteros

Estas en el tema de cómo listar stl de punteros en el foro de C/C++ en Foros del Web. Hola amigos, Tengo una clase base de la cual heredan 2: Clasehija1 y Clasehija2, todos los objetos de las clases hijas los quiero tener en ...
  #1 (permalink)  
Antiguo 01/12/2011, 20:43
 
Fecha de Ingreso: diciembre-2006
Mensajes: 213
Antigüedad: 18 años
Puntos: 3
cómo listar stl de punteros

Hola amigos,

Tengo una clase base de la cual heredan 2: Clasehija1 y Clasehija2, todos los objetos de las clases hijas los quiero tener en una sola lista.

Cómo puedo hacer esto?

Hasta el momento tengo algo parecido a lo siguiente:
Código C++:
Ver original
  1. list <ClaseBase *> lstClaseBase;
  2. ClaseBase *objCasehija1 = new Clasehija1();
  3. ClaseBase *objCasehija2 = new Clasehija2();

Código C++:
Ver original
  1. lstClaseBase.pushback(objCasehija1);
  2. lstClaseBase.pushback(objCasehija2);

Pero no sé si lo anterior está correcto, además necesito una función para muestre el contenido de lstClaseBase.

Tengo algo como lo siguiente pero no me funciona:
Código C++:
Ver original
  1. void listar(list <ClaseBase *> lst) {    
  2.     list <ClaseBase *>::iterator it;
  3.     for( it = lst.begin(); it != lst.end(); it++ ){
  4.        printf("un elemento");
  5.     }  
  6. }
Y en su invocación tengo esto:
Código C++:
Ver original
  1. listar(lstClaseBase);

Yo esperaría ver el mensaje "un elemento" pero veo nada.

Lo que pretendo hacer es lo que les planteaba al principio: en una sola lista, guardar diferentes objetos los cuales son heredados de una clase (la lista es del tipo de la clase base).

Ojalá me puedan dar una mano con esto.

Gracias desde ya.

Saludos
  #2 (permalink)  
Antiguo 02/12/2011, 05:15
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años, 8 meses
Puntos: 228
Respuesta: cómo listar stl de punteros

Eso deberia funcionar. Fijate que la funcion para insertar ne la lista lleva guion bajo.

Código C++:
Ver original
  1. list <ClaseBase *> lstClaseBase;
  2.     Clasehija1 * objCasehija1 = new Clasehija1();
  3.     Clasehija2 * objCasehija2 = new Clasehija2();
  4.  
  5.     lstClaseBase.push_back(objCasehija1);
  6.     lstClaseBase.push_back(objCasehija2);
  #3 (permalink)  
Antiguo 02/12/2011, 07:29
 
Fecha de Ingreso: diciembre-2006
Mensajes: 213
Antigüedad: 18 años
Puntos: 3
Respuesta: cómo listar stl de punteros

Hola,

De antemano muchas gracias por la respuesta, tengo otra pregunta, cuando ya tengo todos los objetos en la lista y quiero invocar a un método de esos objetos que son diferentes. ¿Cómo hago eso?. Les dejo un código ya funcionando pero que me da error en la línea it->VerNombre(); que se encuentra en el for en el método listar.
VerNombre es un método que es heredado y se implementa de diferente forma en las clases hijas.

Código C++:
Ver original
  1. #include <list>
  2. #include <iostream>
  3. using namespace std;
  4. class Persona {
  5. public:
  6.     Persona(char *n) {
  7.         strcpy(nombre, n);
  8.     }
  9.     virtual void VerNombre() {
  10.         cout << nombre << endl;
  11.     }
  12.     virtual void VerApellido(){}
  13. protected:
  14.     char nombre[30];
  15. };
  16. class Empleado : public Persona {
  17. public:
  18.  
  19.     Empleado(char *n) : Persona(n) {
  20.     }
  21.  
  22.     void VerNombre() {
  23.         cout << "Emp: " << nombre << endl;
  24.     }
  25. };
  26. class Estudiante : public Persona {
  27. public:
  28.  
  29.     Estudiante(char *n) : Persona(n) {
  30.     }
  31.  
  32.     void VerNombre() {
  33.         cout << "Est: " << nombre << endl;
  34.     }
  35.     void VerApellido() {
  36.         cout << "Este es mi apellido "<<endl;
  37.     }
  38. };
  39.  
  40. void listar(list <Persona *> lst) ;
  41. /*
  42.  *
  43.  */
  44. int main(int argc, char** argv) {
  45.     list <Persona *> lstPersona;
  46.     Persona *Pepito = new Estudiante("Jose");
  47.     Persona *Carlos = new Empleado("Carlos");
  48.  
  49.     lstPersona.push_back(Pepito);
  50.     lstPersona.push_back(Carlos);
  51.    
  52.     listar(lstPersona);
  53.     return 0;
  54. }
  55.  
  56. void listar(list <Persona *> lst) {
  57.     list <Persona *>::iterator it;
  58.     for( it = lst.begin(); it != lst.end(); it++ ){
  59.         it->VerNombre();
  60.     }
  61. }

Saludos
  #4 (permalink)  
Antiguo 02/12/2011, 08:10
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años, 8 meses
Puntos: 228
Respuesta: cómo listar stl de punteros

it es un puntero a un objeto de la lista, el cual es un puntero a un objeto . Asi que necesita dos desreferencias:

(*it)->VerNombre();
  #5 (permalink)  
Antiguo 02/12/2011, 08:29
 
Fecha de Ingreso: diciembre-2006
Mensajes: 213
Antigüedad: 18 años
Puntos: 3
Respuesta: cómo listar stl de punteros

Muchas gracias por tus aportes, funcionó, disculpa mi insistencia pero se me ocurrió dividir el código en funciones, pero no logro ver nada. Lo tengo así:

Código C++:
Ver original
  1. #include <list>
  2. #include <iostream>
  3. #include <string.h>
  4. using namespace std;
  5.  
  6. class Persona {
  7. public:
  8.  
  9.     Persona(char *n) {
  10.         strcpy(nombre, n);
  11.     }
  12.  
  13.     virtual void VerNombre() {
  14.         cout << nombre << endl;
  15.     }
  16.  
  17.     virtual void VerApellido() {
  18.     }
  19. protected:
  20.     char nombre[30];
  21. };
  22.  
  23. class Empleado : public Persona {
  24. public:
  25.  
  26.     Empleado(char *n) : Persona(n) {
  27.     }
  28.  
  29.     void VerNombre() {
  30.         cout << "Emp: " << nombre << endl;
  31.     }
  32. };
  33.  
  34. class Estudiante : public Persona {
  35. public:
  36.  
  37.     Estudiante(char *n) : Persona(n) {
  38.     }
  39.  
  40.     void VerNombre() {
  41.         cout << "Est: " << nombre << endl;
  42.     }
  43.  
  44.     void VerApellido() {
  45.         cout << "Este es mi apellido " << endl;
  46.     }
  47. };
  48.  
  49. void listar(list <Persona *> lst);
  50. void cargar(list <Persona *> lst);
  51. /*
  52.  *
  53.  */
  54. int main(int argc, char** argv) {
  55.     list <Persona *> lstPersona;
  56.     cargar(lstPersona);
  57.     listar(lstPersona);
  58.     return 0;
  59. }
  60. void cargar(list <Persona *> lst) {
  61.     Persona *Pepito = new Estudiante("Jose");
  62.     Persona *Carlos = new Empleado("Carlos");
  63.  
  64.     lst.push_back(Pepito);
  65.     lst.push_back(Carlos);
  66. }
  67. void listar(list <Persona *> lst) {
  68.     list <Persona *>::iterator it;
  69.     for (it = lst.begin(); it != lst.end(); it++) {
  70.         (*it)->VerNombre();
  71.     }
  72. }

Siguiendo la misma lógica del método listar, intenté hacerlo así:

(*lst)->push_back(Pepito); me generó error

¿Me puedes indicar qué es lo que estoy haciendo mal?
  #6 (permalink)  
Antiguo 02/12/2011, 08:40
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años, 8 meses
Puntos: 228
Respuesta: cómo listar stl de punteros

Estas muy confundido con punteros.
Tu problema esta en que la lista la pasas como una copia, la modificacion la haces en la copia.

Lo del Puntero lo hice porque al hacer el iterador este te devuelve un puntero al objeto. No tiene nada que ver con lo que vos trataste.

Una solucion seria pasar por refencia. esto evita que se haga la copia y tambien elimina el manejo de punteros. Para esto hay que modificar la definicion de cada funcion y agregar el simbolo & al argumento deseado:

Código C++:
Ver original
  1. void cargar(list <Persona *> & lst) {
  2.  
  3. void listar(list <Persona *> & lst) {

Todo lo demas queda igual.

Saludos
  #7 (permalink)  
Antiguo 02/12/2011, 09:01
 
Fecha de Ingreso: diciembre-2006
Mensajes: 213
Antigüedad: 18 años
Puntos: 3
Respuesta: cómo listar stl de punteros

Hola,

Tienes razón, algo ando perdido, pero gracias al ejemplo y a tus aportes se me han aclarado algunas dudas.

Muchas gracias por la ayuda, funciona.

Etiquetas: clase, funcion, punteros, stl
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:03.