Me respondo a mí mismo, he estado investigando y ya he conseguido que los el objeto usuario sea accesible desde el constructor de la tarjeta el código resultante es el siguiente:
CABECERA Tarjeta
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:
Tarjeta (const Numero&, const Usuario&, const Fecha&);/* throw (Tarjeta::Caducada);*/
class Caducada {
public:
Caducada (const Fecha& f) : fecha_(f) {}
Fecha cuando() const { return fecha_; }
private:
Fecha 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();
private:
Numero numero_;
const Usuario* user_;
Fecha caducidad_;
Cadena titular_;
};
#endif
TARJETA.CPP
Código C++:
Ver original#include "tarjeta.h"
#include "usuario.h"
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);
}
USUARIO.H
Código C++:
Ver original#ifndef _USUARIO_H_
#define _USUARIO_H_
#include "cadena.h"
#include "clave.h"
#include "articulo.h"
#include "numero.h"
#include "tarjeta.h"
#include <sstream>
#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
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_;
/* typedef map<Numero, Tarjeta*> Tarjetas;
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&); //Falta cambiarlo a flujo de salida
//inline const Tarjetas& tarjetas() const { return tarjetas_; }
#endif
MAIN.cpp
Código C++:
Ver original#include "usuario.h"
#include "clave.h"
#include "articulo.h"
#include "numero.h"
#include "tarjeta.h"
using namespace std;
int main() {
try {
Usuario yo("1","Jose Ramon","Gago Gomez","Paseo del prado","joseramon");
Usuario yo1("2","Jose Ramon","Gago Gomez","Paseo del prado","joseRamon");
Usuario* pU;
pU = new Usuario("pperez","Perico","Perez Palotes","13 Rue del Percebe","pedrofueacomprarpan");
Fecha f1(0,0,1998);
Fecha f2(0,0,2002);
Fecha f(20,12,2030);
Articulo art1("110","Fundamentos de C++",f1,29.95,1);
Articulo art2("111","Fundamentos BD",f2,25,50);
Numero numer(" 123456 78123 45670 ");
Numero numer1("4417 1234 56789 113 ");
const Tarjeta t(numer,*pU,f);
yo.compra(art1,21);
yo.compra(art2,3);
yo.compra(art1,15);
ostringstream ss;
mostrar_carro(ss,yo);
cout << ss.str() << endl;
} catch (Numero::Incorrecto e) {
cerr << "Excepcion: NUMERO (" << e.razon() << ")"<<endl;
} catch (Usuario::Id_duplicado e) {
cerr << "Excepcion: ID (" << e.idd() << ") duplicado" << endl;
}
return 0;
}
Pero ahora recibo este fallo:
tarjeta.o: In function `Tarjeta::Tarjeta(Numero const&, Usuario const&, Fecha const&)':
tarjeta.cpp:(.text+0x1bd): undefined reference to `Usuario::es_titular_de(Tarjeta&)'
¿Alguien puede decirme el por qué?