Programación General > C/C++
Problema de novato con clases
JuaNiYoT:
Hola, estoy aprendiendo ahora c++ y para programar estoy usando eclipse, ahora bien, cuando defino una clase, uso una opción que trae de generar código fuente para que genere los get y set para la clase. El problema es que he dado con una clase en la que he metido un tipo enum y no me hace automáticamente los get y set, y he probado a hacerlos yo pero me da fallo. Si alguien me puede ayudar... aqui le dejo el fragmento de código. Gracias y un saludo.
--- Código: C++ ---/* EN CLIENTE.H */ class Cliente{private: string DNI; /**<DNI sin letra*/ string nombre; /**<Nombre separado por un espacio en blanco si es necesario*/ unsigned int edad; enum estado_civil{soltero, casado, viudo, divorciado};public: string getDNI() const; unsigned int getEdad() const; string getNombre() const; enum getEstado_civil() const; /*error en esta linea - Multiple markers at this line - Syntax error - use of enum 'getEstado_civil' without previous declaration - expected unqualified-id before ')' token*/ void setDNI(string DNI); void setEdad(unsigned int edad); void setNombre(string nombre); void setEstado_civil(enum estado_civil);};
--- Código: C++ ---/*EN CLIENTE.CPP*/ string Cliente::getDNI() const{ return DNI;} unsigned int Cliente::getEdad() const{ return edad;} string Cliente::getNombre() const{ return nombre;} /*ERROR AQUI - - Syntax error - expected unqualified-id before ')' token - 'getEstado_civil' in class 'Cliente' does not name a type*/enum Cliente::getEstado_civil() const{ return estado_civil;} void Cliente::setDNI(string DNI){ this->DNI = DNI;} void Cliente::setEdad(unsigned int edad){ this->edad = edad;} void Cliente::setNombre(string nombre){ this->nombre = nombre;} void Cliente::setEstado_civil(enum estado_civil){ this->estado_civil = estado_civil; /*ERROR- expected primary-expression before ';' token - invalid use of 'enum Cliente::estado_civil'*/}
ProfesorX:
El error esta en que estas usando mal el enum, enum funciona como si crearas un nuevo tipo, no como si crearas una variable, cuando defines enum estado_civil{soltero, casado, viudo, divorciado}, estas creando un nuevo tipo llamado estado_civil, este tipo solo podra tomar los valores soltero, casado, viudo, divorciado, que internamente valdran 0, 1, 2, 3.
Ademas, necesitas una variable interna a tu clase de tipo privado, que guarde el valor del estado civil, y no, no se puede llamar estado_civil, ya que ese es el nombre del nuevo tipo, tiene que tener un nombre diferente, y debe ser de tipo estado_civil.
Entonces debes definir los metodos getEstado_civil() y setEstado_civil() de manera que utilicen el nuevo tipo, y la variable interna que guarda el estado civil.
No se si me explique bien, pero te dejo el codigo de como deberia ser, supongo que con eso comprenderas mejor lo que te explique arriba. Ademas, he definido estado_civil de tipo public en lugar de private, para que puedas acceder al nuevo tipo fuera de la clase, que pienso que seria mas correcto.
--- Código: C++ --- /* EN CLIENTE.H */class Cliente {public: // enum funciona como si definieras un nuevo tipo enum estado_civil{soltero, casado, viudo, divorciado}; string getDNI() const; unsigned int getEdad() const; string getNombre() const; // Defines el metodo como si regresa un valor de tipo estado_civil estado_civil getEstado_civil() const; void setDNI(string DNI); void setEdad(unsigned int edad); void setNombre(string nombre); // Defines el metodo como si le pasas un parametro de tipo estado_civil void setEstado_civil(estado_civil civil); private: string DNI; /**<DNI sin letra*/ string nombre; /**<Nombre separado por un espacio en blanco si es necesario*/ unsigned int edad; // Variable interna (privada) de tipo estado_civil para guardar el estado civil estado_civil civil;};
--- Código: C++ --- /*EN CLIENTE.CPP*/string Cliente::getDNI() const{ return DNI;} unsigned int Cliente::getEdad() const{ return edad;} string Cliente::getNombre() const{ return nombre;} // Defines el metodo como si regresa un valor de tipo estado_civil Cliente::estado_civil Cliente::getEstado_civil() const{ return this->civil;} void Cliente::setDNI(string DNI){ this->DNI = DNI;} void Cliente::setEdad(unsigned int edad){ this->edad = edad;} void Cliente::setNombre(string nombre){ this->nombre = nombre;} // Defines el metodo como si le pasas un parametro de tipo estado_civilvoid Cliente::setEstado_civil(estado_civil civil){ this->civil = civil;}
Saludos :)
JuaNiYoT:
Muchas gracias me ha quedado clarísimo, muy bien explicado. Un saludo.
JuaNiYoT:
Otra dudilla, he visto que la definición del tipo enumerado la haces como pública pero que en la clase, pones antes la parte pública que la privada. ¿Eso es mejor hacerlo así?. Lo digo porque si lo haces con la parte pública después no reconoce en la parte privada la definición de la variable de tipo estado_civil. Espero haberme explicado. Gracias y un saludo.
m0skit0:
--- Cita de: "JuaNiYoT" ---he visto que la definición del tipo enumerado la haces como pública pero que en la clase, pones antes la parte pública que la privada. ¿Eso es mejor hacerlo así?
--- Fin de la cita ---
Da igual en realidad. Es cuestión de gustos.
--- Cita de: "JuaNiYoT" ---Lo digo porque si lo haces con la parte pública después no reconoce en la parte privada la definición de la variable de tipo estado_civil.
--- Fin de la cita ---
Personalmente pondría en enum en el fichero de cabecera pero fuera de la declaración de la clase. Así podrás usar dicho tipo enumerado en otras clases sólo con incluir dicho fichero de cabecera y no tener que andar definiéndolo de nuevo para cada clase. Todo depende también del diseño de la aplicación y de si dicho tipo va a ser reutilizado. A ver que opina nuestro querido ProfesorX.
Navegación
[#] Página Siguiente
Ir a la versión completa