Antes de nada, debo indicar que hace años que no toco C++ (que tiempos aquellos!!!), y que no tengo ahora mismo un compilador para hacer pruebas, así que todo lo que te diga será con unos conocimientos añejos y sin probar.
1.- En la clase Nodo, prototipas un campo{1} llamado "apellido", y sin embargo en el constructor (en nodo.cpp) declaras una variable local y le asignas el valor del parámetro, en vez de asignarsela a la propiedad del objeto. Probablemente esto sea lo que esté haciendo que muestre basura (tienes un puntero loco).
2.- Te recomiendo que al usar C++, no te quedes simplemente en los objetos y el cout/cin, sino en usar C++ con algo mas de profundidad: Usa los string [cppreference.com].
3.- En principal.cpp, declaras una variable local llamada "l" (asignar nombres de variables correctos te pueden evitar muchos problemas, te recomiendo que la llames "lista"), sin embargo, en la opción "e" ("Crear nuevo directorio"), primero destruyes el objeto "l", y al instante, creas uno nuevo llamado igual (otra vez el problema de una variable de ambito reducido). Yo habría declarado la lista así:
Lista *lista = new Lista();
y en la opción "e" haría:
if(lista!=null) delete lista;
lista = new Lista();
4.- En principal declaras nuevoapellido como un array de 100, y cada vez que introduzcas un apellido lo harás siempre sobre la misma posición de memoria, machacando el apellido que introduciste anteriormente. Esto no sería problema si Lista::insertar(...) hiciese una copia del apellido, en vez de referenciarlo. Para solucinoarlo puedes hacer dos cosas: Copiar el apellido dentro de Lista::insertar, o pasar objetos diferentes cada vez (yo optaría por la primera de las opciones).
5.- Tendría que probarlo, pero el método insertar, rompe la lista. Supongamos que tenemos la lista siguiente "a" -> "b" -> "d" -> "e" y queremos insertar "c". Tras encontrar la posición donde se insertaría, y crear el nodo correspondiente ("d", que es el primero que cumple la condición "while(strcmp(..."), "d" apuntaría al nuevo nodo "c", pero, ¿quien apuntaría a "e"? La nueva lista sería "a" -> "b" -> "d" -> "c" (fijate que no estaría ordenada).
Además de todo esto, existen varios errores de concepto, como por ejemplo, que el método insertar muestre el contenido de la lista (como me dijo una vez un profesor, si tienes un método que ordena, solo tiene que ordenar, e "inserta" debería solo hacer eso: insertar, y "mostrar" solo debería "mostrar"),
{1} Normalmente, se le dice propiedad porque efectivamente, es una propiedad del objeto, pero dado que programo en Java, estoy mas acostumbrado a llamarlo campo (java.lang.reflect.Field)
Gracias; El año pasado tuve que hacer algo bastante similar y no me resultó tan complicado, de hecho fue bastante rápida la cosa. Harto de darme de morros contra la pared y tras leer en algún comentario anterior el uso de std::string y en tu propio comentario también me aconsejas que use strings, empecé a recordar que el año pasado si que use strings y no tanto *char y pascual. Y al ir a coger las prácticas del año pasado lo he visto; Y ya lo tengo todo funcionando.
Esto era lo que daba el 99% de los errores. El detalle que no insertaba de forma ordenada ya lo he solucionado y funciona bien, gracias de nuevo.
La pregunta es por que este profesor hace que todo vaya con char *var o char var[] y junta cosillas de C con C++ y bueno, no creo que salga algo muy bueno de ahí.
Gracias de nuevo por dedicarme tú tiempo a echarme una mano. Un saludo.
Bueno y gracias al resto, incluso para ese pobrecito hablador chamuscado, hiciste que me riera un rato, ciaooo
Existen varios errores
(Puntos:2, Informativo)( http://www.javatos.com/ | Última bitácora: Miércoles, 22 Septiembre de 2004, 23:10h )
1.- En la clase Nodo, prototipas un campo{1} llamado "apellido", y sin embargo en el constructor (en nodo.cpp) declaras una variable local y le asignas el valor del parámetro, en vez de asignarsela a la propiedad del objeto. Probablemente esto sea lo que esté haciendo que muestre basura (tienes un puntero loco).
2.- Te recomiendo que al usar C++, no te quedes simplemente en los objetos y el cout/cin, sino en usar C++ con algo mas de profundidad: Usa los string [cppreference.com].
3.- En principal.cpp, declaras una variable local llamada "l" (asignar nombres de variables correctos te pueden evitar muchos problemas, te recomiendo que la llames "lista"), sin embargo, en la opción "e" ("Crear nuevo directorio"), primero destruyes el objeto "l", y al instante, creas uno nuevo llamado igual (otra vez el problema de una variable de ambito reducido). Yo habría declarado la lista así:
Lista *lista = new Lista();
y en la opción "e" haría:
if(lista!=null) delete lista;
lista = new Lista();
4.- En principal declaras nuevoapellido como un array de 100, y cada vez que introduzcas un apellido lo harás siempre sobre la misma posición de memoria, machacando el apellido que introduciste anteriormente. Esto no sería problema si Lista::insertar(...) hiciese una copia del apellido, en vez de referenciarlo. Para solucinoarlo puedes hacer dos cosas: Copiar el apellido dentro de Lista::insertar, o pasar objetos diferentes cada vez (yo optaría por la primera de las opciones).
5.- Tendría que probarlo, pero el método insertar, rompe la lista. Supongamos que tenemos la lista siguiente "a" -> "b" -> "d" -> "e" y queremos insertar "c". Tras encontrar la posición donde se insertaría, y crear el nodo correspondiente ("d", que es el primero que cumple la condición "while(strcmp(..."), "d" apuntaría al nuevo nodo "c", pero, ¿quien apuntaría a "e"? La nueva lista sería "a" -> "b" -> "d" -> "c" (fijate que no estaría ordenada).
Además de todo esto, existen varios errores de concepto, como por ejemplo, que el método insertar muestre el contenido de la lista (como me dijo una vez un profesor, si tienes un método que ordena, solo tiene que ordenar, e "inserta" debería solo hacer eso: insertar, y "mostrar" solo debería "mostrar"),
{1} Normalmente, se le dice propiedad porque efectivamente, es una propiedad del objeto, pero dado que programo en Java, estoy mas acostumbrado a llamarlo campo (java.lang.reflect.Field)
Re:Existen varios errores
(Puntos:1)( Última bitácora: Domingo, 26 Noviembre de 2006, 15:52h )
Esto era lo que daba el 99% de los errores. El detalle que no insertaba de forma ordenada ya lo he solucionado y funciona bien, gracias de nuevo.
La pregunta es por que este profesor hace que todo vaya con char *var o char var[] y junta cosillas de C con C++ y bueno, no creo que salga algo muy bueno de ahí.
Gracias de nuevo por dedicarme tú tiempo a echarme una mano. Un saludo.
Bueno y gracias al resto, incluso para ese pobrecito hablador chamuscado, hiciste que me riera un rato, ciaooo