Buenas,
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