SoloCodigo

Programación General => C/C++ => Mensaje iniciado por: Arcueid en Sábado 28 de Febrero de 2009, 19:23

Título: Clases parametricas
Publicado por: Arcueid en Sábado 28 de Febrero de 2009, 19:23
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...
Título: Re: Clases parametricas
Publicado por: Eternal Idol en Sábado 28 de Febrero de 2009, 19:58
ListaObjetos<objeto3D> *list = new ListaObjetos<objeto3D>();
Título: Re: Clases parametricas
Publicado por: Arcueid en Domingo 1 de Marzo de 2009, 01:04
Me gustaria decir que funciona, pero sigue dando errores  :oops:

undefined reference to `ListaObjetos<objeto3D>::ListaObjetos()'
Título: Re: Clases parametricas
Publicado por: Eternal Idol en Domingo 1 de Marzo de 2009, 10:17
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.
Título: Re: Clases parametricas
Publicado por: Arcueid en Lunes 2 de Marzo de 2009, 01:44
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.  
Título: Re: Clases parametricas
Publicado por: Eternal Idol en Lunes 2 de Marzo de 2009, 09:19
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.
Título: Re: Clases parametricas
Publicado por: Arcueid en Lunes 2 de Marzo de 2009, 11:26
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.
Título: Re: Clases parametricas
Publicado por: Eternal Idol en Lunes 2 de Marzo de 2009, 11:29
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)