Ver Mensaje Individual
  #2 (permalink)  
Antiguo 03/04/2014, 01:07
DvNe
 
Fecha de Ingreso: octubre-2012
Mensajes: 37
Antigüedad: 12 años, 2 meses
Puntos: 0
Respuesta: Llamada a método dentro de constructor

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
  1. #ifndef _TARJETA_H_
  2. #define _TARJETA_H_
  3.  
  4. #include "fecha.h"
  5. #include "cadena.h"
  6. #include "numero.h"
  7.  
  8. class Usuario;
  9.  
  10. class Tarjeta {
  11.  public:
  12.   Tarjeta (const Numero&, const Usuario&, const Fecha&);/* throw (Tarjeta::Caducada);*/
  13.   class Caducada {
  14.   public:
  15.     Caducada (const Fecha& f) : fecha_(f) {}
  16.     Fecha cuando() const { return fecha_; }
  17.   private:
  18.     Fecha fecha_;
  19.   };
  20.   Numero numero() const { return numero_; }
  21.   Fecha caducidad() const { return caducidad_; }
  22.   Cadena titular_facial() const { return titular_; }
  23.   const Usuario* titular() const { return user_; }
  24.   void anula_titular();
  25.  private:
  26.   Numero numero_;
  27.   const Usuario* user_;
  28.   Fecha caducidad_;
  29.   Cadena titular_;
  30. };
  31. #endif

TARJETA.CPP

Código C++:
Ver original
  1. #include "tarjeta.h"
  2. #include "usuario.h"
  3.  
  4. Tarjeta::Tarjeta (const Numero& n, const Usuario& user, const Fecha& f) : numero_(n), user_(&user), caducidad_(f) {
  5.   titular_ = user.nombre() + " " + user.apellidos();
  6.   Fecha f_actual;
  7.   if (caducidad_ < f_actual)
  8.     throw(Tarjeta::Caducada(caducidad_));
  9.  
  10.   const_cast<Usuario&>(user).es_titular_de(*this);
  11. }

USUARIO.H

Código C++:
Ver original
  1. #ifndef _USUARIO_H_
  2. #define _USUARIO_H_
  3.  
  4. #include "cadena.h"
  5. #include "clave.h"
  6. #include "articulo.h"
  7. #include "numero.h"
  8. #include "tarjeta.h"
  9.  
  10. #include <sstream>
  11. #include <map>
  12. #include <set>
  13. using std::map;
  14. using std::set;
  15.  
  16. class Tarjeta;
  17.  
  18. class Usuario {
  19.  public:
  20.   //CONSTRUCTOR Y DESTRUCTOR
  21.   Usuario (const Cadena&, const Cadena&, const Cadena&, const Cadena&, const char*);
  22.   //~Usuario();
  23.  
  24.   class Id_duplicado {
  25.   public:
  26.     Id_duplicado (const Cadena& id) : id_duplicado(id) {}
  27.     const Cadena idd() { return id_duplicado; }
  28.   private:
  29.     const Cadena id_duplicado;
  30.   };
  31.   //FUNCIONES OBSERVADORAS
  32.   Cadena id() const { return identificador_; }
  33.   Cadena nombre() const { return nombre_; }
  34.   Cadena apellidos() const { return apellidos_; }
  35.   Cadena direccion() const { return direccion_; }
  36.   Cadena password() const { return password_.clave(); }
  37.  
  38.   //FUNCIONES CON TARJETAS
  39.  
  40.   void es_titular_de(Tarjeta&);
  41.   /*  void no_es_titular_de(Tarjeta&);
  42.   const Tarjetas& tarjetas() const;
  43.   */
  44.  
  45.   //FUNCIONES CON LOS ARTICULOS
  46.   typedef map<Articulo*, unsigned> Articulos;
  47.   void compra(Articulo&, unsigned);
  48.   const Articulos& compra() const { return articulos_; }
  49.   size_t n_articulos() const { return articulos_.size(); }
  50.  
  51.   //SOBRECARGA OPERADOR
  52.   friend std::ostream& operator << (std::ostream&, const Usuario&);
  53.  
  54.  private:
  55.   Cadena identificador_;
  56.   Cadena nombre_;
  57.   Cadena apellidos_;
  58.   Cadena direccion_;
  59.   Clave password_;
  60.   /*  typedef map<Numero, Tarjeta*> Tarjetas;
  61.       Tarjetas tarjetas_;*/
  62.   Articulos articulos_;
  63.  
  64.   static set<Cadena> identificadores;
  65.   bool IdValido() const throw(Usuario::Id_duplicado);
  66.   Usuario (const Usuario&); //Deshabilitamos la copia de un usuario
  67. };
  68.  
  69. void mostrar_carro(std::ostringstream&, const Usuario&); //Falta cambiarlo a flujo de salida
  70. //inline const Tarjetas& tarjetas() const { return tarjetas_; }
  71.  
  72. #endif

MAIN.cpp

Código C++:
Ver original
  1. #include "usuario.h"
  2. #include "clave.h"
  3. #include "articulo.h"
  4. #include "numero.h"
  5. #include "tarjeta.h"
  6.  
  7. using namespace std;
  8.  
  9. int main() {
  10.   try {
  11.     Usuario yo("1","Jose Ramon","Gago Gomez","Paseo del prado","joseramon");
  12.     Usuario yo1("2","Jose Ramon","Gago Gomez","Paseo del prado","joseRamon");
  13.     Usuario* pU;
  14.     pU = new Usuario("pperez","Perico","Perez Palotes","13 Rue del Percebe","pedrofueacomprarpan");
  15.  
  16.    
  17.     Fecha f1(0,0,1998);
  18.     Fecha f2(0,0,2002);
  19.     Fecha f(20,12,2030);
  20.     Articulo art1("110","Fundamentos de C++",f1,29.95,1);
  21.     Articulo art2("111","Fundamentos BD",f2,25,50);
  22.  
  23.     Numero numer(" 123456  78123  45670  ");
  24.     Numero numer1("4417 1234 56789 113  ");
  25.  
  26.  
  27.     const Tarjeta t(numer,*pU,f);
  28.  
  29.     yo.compra(art1,21);
  30.     yo.compra(art2,3);
  31.     yo.compra(art1,15);
  32.     ostringstream ss;
  33.     mostrar_carro(ss,yo);
  34.     cout << ss.str() << endl;
  35.   } catch (Numero::Incorrecto e) {
  36.     cerr << "Excepcion: NUMERO (" << e.razon() << ")"<<endl;
  37.   }  catch (Usuario::Id_duplicado e) {
  38.     cerr << "Excepcion: ID (" << e.idd() << ") duplicado" << endl;
  39.   }
  40.   return 0;
  41. }

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é?