Estoy realizando una clase Tarjeta, la cual tiene el siguiente constructor:
Código C++:
Ver original
#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 C++:
Ver original
#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 C++:
Ver original
#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