Ver Mensaje Individual
  #6 (permalink)  
Antiguo 13/05/2015, 04:47
eferion
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 1 mes
Puntos: 204
Respuesta: insertar una cadena en una lista

Para no hablar en plan genérico, voy a particularizar los templates. Te permitirá entender mejor el problema.

  • Nodo<char> almacena un char*, es decir, un puntero a char.
  • Lista<char>::Insertar( ) recibe un char*
  • Al imprimir la lista haces:
    Código C++:
    Ver original
    1. cout<< actual->getElemento()<< endl;
    es decir, estás imprimiendo un char*. Da la casualidad que char* es el tipo utilizado por las cadenas de caracteres... luego cout va a volcar caracteres por pantalla hasta que se encuentre con el primer caracter nulo. Da la casualidad también que no has añadido los caracteres a la lista, sino que has añadido su posición en memoria... por algo almacenas punteros. El caso es que los punteros de Nodo<char> apuntan directamente a la cadena original... luego al volcar el char* te va a imprimir el contenido original de la cadena, pero empezando por el caracter que corresponda.

Soluciones... veo dos posibles:

Solución chapucera

Cambias el cout de Lista<T>::ImprimeLista para que luzca tal que:

Código C++:
Ver original
  1. cout<< *actual->getElemento()<< endl;

De esta forma no estarás volcando un char*, sino simplemente un char

Solución buena

Lo suyo sería modificar los templates. El comportamiento que yo esperaría de un template tipo Nodo<T> es que si yo creo un Nodo<char>, esta estructura trabaje con el tipo char, no con el tipo char*... si resulta que necesito trabajar con char* entonces crearé una estructura tal que Nodo<char*>. Este cambio de concepto te permitirá crear templates más consistentes y versátiles.

Por supuesto además de Nodo<T> también tendrás que modificar Lista<T> para que deje de usar punteros T* sin venir a cuento. Es una solución más laboriosa pero a la vez más limpia y, por supuesto, es la solución que yo te recomiendo.

Un saludo.