• Lunes 16 de Diciembre de 2024, 09:43

Autor Tema:  Clases parametricas  (Leído 1987 veces)

Arcueid

  • Visitante
Clases parametricas
« en: Sábado 28 de Febrero de 2009, 19:23 »
0
Buenas!

Tengo una duda sobre las clases parametricas. Estoy definiendo una lista parametrica en C++ que usa el std::list, para poder hacer una lista de cualquier tipo de objetos (en este caso, "objetos3D").

El problema esta en el constructor ya que al crear un nuevo objeto de tipo lista:

   ListaObjetos<objeto3D> list = new ListaObjetos<objeto3D>();

Dice "error: conversion from ‘ListaObjetos<objeto3D>*’ to non-scalar type ‘ListaObjetos<objeto3D>’ requested"

ListaObjetos.h

Código: C++
  1.  
  2. template <class T>
  3. class ListaObjetos {
  4.  
  5.     std::list<T> lista;
  6.  
  7. public:
  8.  
  9.     ListaObjetos(void);
  10.     .....
  11. }:
  12.  

ListaObjetos.cpp

Código: C++
  1. template <class T>
  2. ListaObjetos<T>::ListaObjetos(void)
  3. {
  4.     lista = NULL;
  5. }
  6.  

Alguien tiene idea de lo que pasa? Hay algun problema con punteros o memoria?

Gracias...

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Clases parametricas
« Respuesta #1 en: Sábado 28 de Febrero de 2009, 19:58 »
0
ListaObjetos<objeto3D> *list = new ListaObjetos<objeto3D>();

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

Arcueid

  • Visitante
Re: Clases parametricas
« Respuesta #2 en: Domingo 1 de Marzo de 2009, 01:04 »
0
Me gustaria decir que funciona, pero sigue dando errores  :oops:

undefined reference to `ListaObjetos<objeto3D>::ListaObjetos()'

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Clases parametricas
« Respuesta #3 en: Domingo 1 de Marzo de 2009, 10:17 »
0
Me gustaria ayudarte pero tu codigo esta incompleto, el error que tenias te lo solucione, este tiene toda la pinta de ser un problema de enlazado, asegurate que estas compilando ListaObjetos.cpp y proba solo compilando para verificar que el problema sea en tiempo de enlazado.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

Arcueid

  • Visitante
Re: Clases parametricas
« Respuesta #4 en: Lunes 2 de Marzo de 2009, 01:44 »
0
Problema localizado! :rolleyes: Definia esta clase de manera separada en .h y .cpp, cuando solo hay que hacerlo en el .h.

Ahora compila sin errores, pero... A la hora de compilar y abrir la ventana de openGL (C++ en eclipse bajo Linux), esta se cierra inmediatamente.

El problema esta en la gestion de la memoria en esta clase, en concreto en la funcion void addLista(T const &obj), pero no se me ocurre como permitir agregar elementos a la lista sin que de el error.

main.cpp

Código: C++
  1.     objeto3D vehiculo;
  2.     objeto3D edificio;
  3.  
  4.     ListaObjetos<objeto3D> *list = new ListaObjetos<objeto3D>();
  5.  
  6.     list->addLista(vehiculo);
  7.     list->addLista(edificio);
  8.  

ListaObjetos.h

Código: C++
  1. template <class T>
  2. class ListaObjetos {
  3.  
  4.     std::list<T> *lista;
  5.  
  6. public:
  7.  
  8.     ListaObjetos(void)
  9.     {
  10.         lista = NULL;
  11.     }
  12.  
  13.     ~ListaObjetos<T>(void)
  14.     {
  15.         if(!(&lista).empty())
  16.         {
  17.             &lista.erase(&lista.begin(),&lista.end()+1);
  18.         }
  19.     }
  20.  
  21.     void addLista(T const &obj)
  22.     {
  23.         lista->push_back(obj);
  24.     }
  25.  
  26.     ....
  27.  
  28. };
  29.  

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Clases parametricas
« Respuesta #5 en: Lunes 2 de Marzo de 2009, 09:19 »
0
La proxima vez pone una version compilable del codigo (main incluido). No me gusta tener que perder el tiempo creando los archivos y menos que menos completando lo que falta, la logica me dice que cuanto menos pasos tengamos que dar mas probabilidades habra de que tengamos ganas de invertir nuestro tiempo en problemas ajenos. ¿Se entiende la logica, no?

Ahora el problema, lista es un puntero NULO, tenes esto en el constructor:
        lista = NULL;

Obviamente cuando llamas a addLista desreferencias un puntero NULO:
        lista->push_back(obj);

Podes hacerlo sin memoria dinamica o usar new en el constructor para darle un valor valido a lista. El destructor mejor borralo y hacelo de nuevo.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

Arcueid

  • Visitante
Re: Clases parametricas
« Respuesta #6 en: Lunes 2 de Marzo de 2009, 11:26 »
0
He puesto poco codigo porque se que cuanto mas localizado el error, mas facil sera remediarlo. Cuando alguien me pregunta por que un codigo que no funciona no tengo ganas de leerme las 200 lineas de codigo mas las clases asociadas y luego comprobar las llamadas del main, a ver donde puede estar el error. Pero si aqui funcionais mejor con el codigo al completo ya lo pondre todo.

Creo que el error esta solucionado, usando memoria dinamica.
Gracias.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Clases parametricas
« Respuesta #7 en: Lunes 2 de Marzo de 2009, 11:29 »
0
Cita de: "Arcueid"
He puesto poco codigo porque se que cuanto mas localizado el error, mas facil sera remediarlo. Cuando alguien me pregunta por que un codigo que no funciona no tengo ganas de leerme las 200 lineas de codigo mas las clases asociadas y luego comprobar las llamadas del main, a ver donde puede estar el error. Pero si aqui funcionais mejor con el codigo al completo ya lo pondre todo.

No hace falta que este completo pero si que sea una version compilable, por lo menos yo no quiero LEER el codigo en busqueda del error sino DEPURARLO que fue lo que hice en este caso para encontrar el problema. Si, es cierto, podria haberlo visto leyendo pero la verdad me resulta mucho mas rapido y efectivo depurar.

Cita de: "Arcueid"
Creo que el error esta solucionado, usando memoria dinamica.
Gracias.

Bien, de nadas  B)

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.