Ver Mensaje Individual
  #2 (permalink)  
Antiguo 19/11/2013, 06:21
vosk
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 8 meses
Puntos: 83
Respuesta: cambiar valor de return

Puedes usar otro flag de estado como el que tienes en 'registrar()', pero este será privado y ademas será el valor de retorno de la funcion 'estado()' (que puedes modificar el tipo para que retorne bool en vez de entero)

En la clase añades el flag privado:

Código C++:
Ver original
  1. bool flag_session_status;

Seguramente se iniciará el flag a 0, pero si quieres asegurarte añades el constructor de la clase y reinicias manualmente a 0:

Código C++:
Ver original
  1. Empleado::Empleado() {
  2.     flag_session_status = 0;
  3. }

Luego en el metodo 'iniciar_sesion()' si se consiguió iniciar la sesion asignas 1 al flag de estado, o en caso de error restauras a 0; y lo mismo para finalizar la sesion.

Finalmente modificas el metodo estado para que te retorne el flag de estado que será un indicador de la sesion:

Código C++:
Ver original
  1. bool Empleado::estado() {
  2.     return flag_session_status;
  3. }

Y para que quede redondo puedes añadir un entero a modo de ultimo error, de forma que si durante el inicio de sesion falla el nombre de usuario asignas (por ejemplo) 1 al ultimo error, si falla la contraseña asignas 2, si falla el acceso a la base de datos asignas 3; de esta forma ante cualquier error reseteas el flag de estado de la sesion a 0 y determinas un numero de error, luego en el main si el metodo 'estado()' te retorna 0 (es decir si no pudo iniciar la sesion) llamas al metodo 'get_last_error()' y recibes el numero de error, de forma que sabes lo que falló; junto con esto declaras una lista de errores posibles y una lista de descripciones textuales del error y asi compactas el manejo de errores:


Código C++:
Ver original
  1. enum SESSION_ERROR_INDEX {
  2.     ERROR_SUCCESS,
  3.     ERROR_MISSINGNAME,
  4.     ERROR_WRONGNAME,
  5.     ERROR_COUNT
  6. };
  7.  
  8. static char *SESSION_ERROR_MESSAGES[ERROR_COUNT] = {
  9.     "No error",
  10.     "Missing name",
  11.     "User name does not exist"
  12. };
  13.  
  14. bool Empleado::iniciar_sesion(char *name) {
  15.  
  16.     //comprueba que recibe un nombre
  17.     if(!name || strlen(name) <= 0) {
  18.         flag_session_status = 0;
  19.         last_error = ERROR_MISSINGNAME;
  20.         return flag_session_status;
  21.     }
  22.    
  23.     //evalua el nombre contra la base de datos
  24.     if(strcmp(name, "qwe")) {
  25.         flag_session_status = 0;
  26.         last_error = ERROR_WRONGNAME;
  27.         return flag_session_status;
  28.     }
  29.    
  30.     //inicio correcto
  31.     flag_session_status = 1;
  32.     last_error = ERROR_SUCCESS;
  33.    
  34.     return flag_session_status;
  35. }
  36.  
  37.  
  38. bool Empleado::estado() {
  39.     return flag_session_status;
  40. }
  41.  
  42.  
  43. int Empleado::get_last_error() {
  44.     return last_error;
  45. }
  46.  
  47.  
  48. char *Empleado::get_last_error_message() {
  49.     return SESSION_ERROR_MESSAGES[last_error];
  50. }

Ahora el estado del inicio lo puedes comprobar directamente desde el metodo 'iniciar_sesion()' , y puedes dejar el metodo 'estado()' para siguientes comprovaciones:
Código C++:
Ver original
  1. if(e.iniciar_sesion("qwe")) {
  2.     printf("%s", get_last_error_message());
  3. }

*Nota: normalmente se usa el 0 como ejecucion sin error y >0 como indice de error.

Es solo una idea de implementacion para la clase, hay mas formas de hacerlo.

Saludos
vosk