• Viernes 3 de Mayo de 2024, 02:29

Autor Tema:  Proyecto C++ STL  (Leído 1664 veces)

achadual

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Proyecto C++ STL
« en: Miércoles 2 de Septiembre de 2009, 13:08 »
0
Buenas, estoy realizando un proyecto en C++ y me he topado con un problema que no se solucionar, si me ayudasen les estaría muy agradecido.

Se trata de una aplicación para gestionar una liga de futbol por medio de listas, usando la colección STL <list>.
La aplicación tiene una interfaz para comunicarse con el usuario, esta interfaz invoca a métodos de una base de datos, que a su vez invoca métodos de una clase lista, que a su vez invoca a métodos de la clase del objeto.

Mi problema es que usando un mismo método en dos sitios distintos, funciona en uno y en otro no.

Les voy a presentar el código a ver si me pueden ayudar:

clase Interfaz.cpp: este es el menu de una de las funciones de la aplicación:

Código: C++
  1. void Interfaz::verEquipo(){
  2. string equipo;
  3. string cod;
  4. int orden = -1;
  5. while ((orden<0)||(orden>3)){
  6. clrscr();
  7. cout << " CONSULTAR EQUIPO" << endl;
  8. cout << "1 Introducir el nombre del equipo" << endl;
  9. cout << "2 Introducir el código del equipo" << endl;
  10. cout << "3 Ver lista de equipos de la liga" << endl;
  11. cout<<"Pulse el numero correspondiente a la accion"<<endl;
  12.  
  13. orden=leerNum();
  14. switch (orden){
  15. case 1:
  16. cout << "Introduzca el nombre del equipo" << endl;
  17. equipo=leerLinea();
  18. bbdd->consultarEquipoNom(equipo);
  19. break;
  20. case 2:
  21. cout << "Introduzca el codigo del equipo" << endl;
  22. cod=leerLinea();
  23. bbdd->consultarEquipoCod(cod);
  24. break;
  25. case 3:
  26. bbdd->listarEquipos();
  27. cout << "Introduzca el nombre del equipo" << endl;
  28. equipo=leerLinea();
  29. bbdd->consultarEquipoNom(equipo);
  30. break;
  31. default:
  32.  
  33. cout << "Opcion incorrecta." <endl;
  34. break ;
  35. }
  36. cout << "Pulsa una tecla para continuar." << endl;
  37. _getch();
  38. }
  39.  
 
 
voy a tomar como ejemplo:
Código: C++
  1. bbdd->consultarEquipoCod(cod); // que funciona correctamente
  2.  
  3. int BaseDeDatos::consultarEquipoCod(string codEquipo){
  4. Equipo *aux = new Equipo(codEquipo, " ");
  5. if(lEquipos.estaEquipo(aux)){
  6. lEquipos.consultar(lEquipos.buscar(aux));
  7. }else{
  8. cout<< "ERROR. El equipo no existe"<<endl;
  9. }
  10. return 0;
  11. }
  12.  
 
os pongo el método lEquipos.estaEquipo() y lEquipos.buscar():
 
Código: C++
  1. bool ListaEquipos::estaEquipo (Equipo *e){
  2. return ListaEquipos::buscar(e)!=NULL;
  3. }
  4.  
  5. Equipo* ListaEquipos::buscar(Equipo *e){
  6. list<Equipo*>::iterator it;
  7.  
  8. for (it = listaE.begin(); it != listaE.end(); it++){
  9. if (**it == *e){
  10. return *it;
  11. }
  12. }
  13. return 0; // elemento no encontrado
  14. }
  15.  

pues bien, aqui viene el problema, el método estaEquipo() funciona correctamente para:

Código: C++
  1. int BaseDeDatos::consultarEquipoCod(string codEquipo){} //que ya les he
  2. //detallado arriba.
  3.  

pero no funciona para:
Código: C++
  1. int BaseDeDatos::consultarEquipoNom(string nombre){
  2. Equipo *aux = new Equipo(" ", nombre);
  3. if(lEquipos.estaEquipo(aux)){ //**NUNCA ENTRA EN ESTE IF**
  4. lEquipos.consultar(lEquipos.buscar(aux));
  5. }else{
  6. cout<< "ERROR. El equipo no existe"<<endl;
  7. }
  8. return 0;
  9. }
  10.  

lo mismo ocurre con el método:
Código: C++
  1. int BaseDeDatos::bajaEquipo(string codEquipo, string nombre){
  2. Equipo *aux = new Equipo(codEquipo, nombre);
  3. if(lEquipos.estaEquipo(aux)){
  4. lEquipos.eliminar(lEquipos.buscar(aux));
  5. }else{
  6. cout<< "ERROR. El equipo no existe"<<endl;
  7. }
  8. return 0;
  9. }
  10.  

he intentado reescribirlo de otra manera:
Código: C++
  1. int BaseDeDatos::bajaEquipo(string codEquipo, string nombre){
  2. Equipo *aux = new Equipo(codEquipo, nombre);
  3. Equipo *aux2 = lEquipos.buscar(aux);
  4. delete aux;
  5. if(aux2 != 0){
  6. lEquipos.eliminar(aux2);
  7. }else{
  8. cout<< "ERROR. El equipo no existe "<<endl;
  9. }
  10. return 0;
  11. }
  12.  

he probado a pasarle por parámetro sólo el nombre, o sólo el código y tampoco.

¿Por qué el método lEquipos.estaEquipo() funciona en algunos casos y en otros no?

muchas gracias por adelantado

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Proyecto C++ STL
« Respuesta #1 en: Miércoles 2 de Septiembre de 2009, 13:58 »
0
Asumo que estas sobrecargando el operador == en la clase Equipo, mostranos el codigo. Te recomiendo que lo depures igual, asi vas a viendo que hay en listaE por ejemplo ...

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.

achadual

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Re: Proyecto C++ STL
« Respuesta #2 en: Miércoles 2 de Septiembre de 2009, 18:16 »
0
Ahi estaba el problema. A veces tanto buscar no veo lo más evidente...

Equipo* ListaEquipos::buscar(Equipo *e){
   list<Equipo*>::iterator it;

   for (it = listaE.begin(); it != listaE.end(); it++){
      if (**it == *e){
         return *it;
      }
   }
   return 0;
}

compara dos objetos de tipo Equipo, y la sobrecarga del método == es para codigoEquipo, no para el nombre

bool operator== (const Equipo &e1, const Equipo &e2){
   return e1.getCodEquipo() == e2.getCodEquipo();
}

¿puedo sobrecargar dos veces el operador " == ", o tendria que llamarlo de otra manera?

GRACIAS

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Proyecto C++ STL
« Respuesta #3 en: Jueves 3 de Septiembre de 2009, 09:10 »
0
Podes crear un metodo que use esa comparacion y listo ...

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.