| Ver tema anterior :: Ver siguiente tema | | Autor | Mensaje |
|---|
DvNe
Registrado: 02 Abr 2014 Mensajes: 5
| Publicado: 02/04/2014 11:39 am | | | Título: Pasar 'this' como parametro |
| Buenas,
Estoy realizando una clase Tarjeta, la cual tiene el siguiente constructor:
| Código: | #include "tarjeta.h" #include "usuario.h"
using namespace std;
Tarjeta::Tarjeta (const Numero& numero, const Usuario &user, const Fecha& caducidad) : numero_(numero), user_(&user), caducidad_(caducidad) { Fecha f_actual; titular_ = user.nombre() + " " + user.apellidos();
if (caducidad_ < f_actual) throw(Tarjeta::Caducada(caducidad_)); //(&user).es_titular_de(*this); }
|
Por otro lado, aquí tenemos la cabecera tarjeta.h
| Código: | #ifndef _TARJETA_H_ #define _TARJETA_H_
#include "fecha.h" #include "cadena.h" #include "numero.h"
class Usuario;
class Tarjeta { public: class Caducada { public: Caducada (const Fecha& f) : fecha_(f) {} Fecha cuando() const { return fecha_; } private: Fecha fecha_; };
Tarjeta (const Numero&, const Usuario&, const Fecha&); Numero numero() const { return numero_; } Fecha caducidad() const { return caducidad_; } Cadena titular_facial() const { return titular_; } const Usuario* titular() const { return user_; } void anula_titular();
friend std::ostream& operator << (std::ostream&, const Tarjeta&); private: Numero numero_; //Numero de identificacion de la tarjeta const Usuario * const user_; //Puntero constante al usuario dueño Fecha caducidad_; //Fecha de caducidad Cadena titular_; // Nombre y apellidos del dueño
Tarjeta (const Tarjeta&);//Deshabilitamos copia de una tarjeta }; #endif |
Y por otro lado, los archivos de USUARIO:
| Código: | #ifndef _USUARIO_H_ #define _USUARIO_H_
#include "cadena.h" #include "clave.h" #include "articulo.h" #include "tarjeta.h" #include "numero.h"
#include <sstream> //ostringstream #include <map> #include <set> using std::map; using std::set;
class Tarjeta;
class Usuario { public: //CONSTRUCTOR Y DESTRUCTOR Usuario (const Cadena&, const Cadena&, const Cadena&, const Cadena&, const char*); //~Usuario(); class Id_duplicado { public: Id_duplicado (const Cadena& id) : id_duplicado(id) {} const Cadena idd() { return id_duplicado; } private: const Cadena id_duplicado; }; //FUNCIONES OBSERVADORAS Cadena id() const { return identificador_; } Cadena nombre() const { return nombre_; } Cadena apellidos() const { return apellidos_; } Cadena direccion() const { return direccion_; } Cadena password() const { return password_.clave(); }
//FUNCIONES CON TARJETAS typedef map<Numero, Tarjeta*> Tarjetas; void es_titular_de(Tarjeta&); /* void no_es_titular_de(Tarjeta&); const Tarjetas& tarjetas() const; */ //FUNCIONES CON LOS ARTICULOS typedef map<Articulo*, unsigned> Articulos; void compra(Articulo&, unsigned); const Articulos& compra() const { return articulos_; } size_t n_articulos() const { return articulos_.size(); }
//SOBRECARGA OPERADOR friend std::ostream& operator << (std::ostream&, const Usuario&); private: Cadena identificador_; Cadena nombre_; Cadena apellidos_; Cadena direccion_; Clave password_; /* Tarjetas tarjetas_;*/ Articulos articulos_;
static set<Cadena> identificadores; bool IdValido() const throw(Usuario::Id_duplicado); Usuario (const Usuario&); //Deshabilitamos la copia de un usuario };
void mostrar_carro(std::ostringstream&, const Usuario&); //inline const Tarjetas& tarjetas() const { return tarjetas_; }
#endif |
El problema es que cada vez que se crea una tarjeta, su constructor, debe asociar al usuario dueño la existencia de dicha tarjeta con la función void es_titular_de(Tarjeta&);
Pero no sé hacerlo ya que me sale un error diciendo:
pasar ‘const Usuario’ como el argumento ‘this’ de ‘void Usuario::es_titular_de(Tarjeta&)’ descarta a los calificadores [/code] |
| | Volver arriba | |  | daltomi
Registrado: 28 Abr 2007 Mensajes: 335 Ubicación: Argentina
| Publicado: 02/04/2014 4:39 pm | | | Título: |
| La función es_titular_de() debe ser constante, porque const Usurario& user es constante. Es decir, le habías prometido al compilador que no modificarías user. Opcion 1, en Usuario:
| Código: | void es_titular_de(Tarjeta&) const { } |
Opcion 2, en el ctor. de Tarjeta:
| Código: | const_cast<Usuario&>(user).es_titular_de(*this); |
Saludos. |
| | Volver arriba | |  | DvNe
Registrado: 02 Abr 2014 Mensajes: 5
| Publicado: 02/04/2014 10:44 pm | | | Título: |
| He probado la segunda opción puesto que no puedo modificar la definición de la función es_titular_de(). Este es el código resultante:
| Código: | Tarjeta::Tarjeta (const Numero& n, const Usuario& user, const Fecha& f) : numero_(n), user_(&user), caducidad_(f) { titular_ = user.nombre() + " " + user.apellidos(); Fecha f_actual; if (caducidad_ < f_actual) throw(Tarjeta::Caducada(caducidad_)); const_cast<Usuario&>(user).es_titular_de(*this); }
|
Pero me sale el siguiente error:
tarjeta.o: In function `Tarjeta::Tarjeta(Numero const&, Usuario const&, Fecha const&)': tarjeta.cpp:(.text+0x1bd): undefined reference to `Usuario::es_titular_de(Tarjeta&)' |
| | Volver arriba | |  | | daltomi
Registrado: 28 Abr 2007 Mensajes: 335 Ubicación: Argentina
| Publicado: 03/04/2014 9:06 am | | | Título: |
| Así, ha simple vista, la función esta declarada pero no definida.
| Código: | class Usuario { void es_titular_de(Tarjeta&); //declaración };
|
| Código: | void Usuario::es_titular_de(Tarjeta& t) { ... } // definición
|
|
| | Volver arriba | |  | DvNe
Registrado: 02 Abr 2014 Mensajes: 5
| Publicado: 03/04/2014 1:34 pm | | | Título: |
| Si llevas razón ya lo termine muchas gracias.
Saludos |
| | Volver arriba | |  | | |
| No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas
|
|
| |