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

Buenas,

Estoy realizando una clase Tarjeta, la cual tiene el siguiente constructor:

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

Por otro lado, aquí tenemos la cabecera tarjeta.h

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.   class Caducada {
  13.   public:
  14.     Caducada (const Fecha& f) : fecha_(f) {}
  15.     Fecha cuando() const { return fecha_; }
  16.   private:
  17.     Fecha fecha_;
  18.   };
  19.  
  20.   Tarjeta (const Numero&, const Usuario&, const Fecha&);
  21.  
  22.   Numero numero() const { return numero_; }
  23.   Fecha caducidad() const { return caducidad_; }
  24.   Cadena titular_facial() const { return titular_; }
  25.   const Usuario* titular() const { return user_; }
  26.   void anula_titular();
  27.  
  28.   friend std::ostream& operator << (std::ostream&, const Tarjeta&);
  29.  private:
  30.   Numero numero_; //Numero de identificacion de la tarjeta
  31.   const Usuario * const user_; //Puntero constante al usuario dueño
  32.   Fecha caducidad_; //Fecha de caducidad
  33.   Cadena titular_; // Nombre y apellidos del dueño
  34.  
  35.   Tarjeta (const Tarjeta&);//Deshabilitamos copia de una tarjeta
  36. };
  37. #endif

Y por otro lado, los archivos de USUARIO:

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 "tarjeta.h"
  8. #include "numero.h"
  9.  
  10. #include <sstream> //ostringstream
  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.   typedef map<Numero, Tarjeta*> Tarjetas;
  40.   void es_titular_de(Tarjeta&);
  41.   /*
  42.  
  43.   void no_es_titular_de(Tarjeta&);
  44.   const Tarjetas& tarjetas() const;
  45.   */
  46.  
  47.   //FUNCIONES CON LOS ARTICULOS
  48.   typedef map<Articulo*, unsigned> Articulos;
  49.   void compra(Articulo&, unsigned);
  50.   const Articulos& compra() const { return articulos_; }
  51.   size_t n_articulos() const { return articulos_.size(); }
  52.  
  53.   //SOBRECARGA OPERADOR
  54.   friend std::ostream& operator << (std::ostream&, const Usuario&);
  55.  
  56.  private:
  57.   Cadena identificador_;
  58.   Cadena nombre_;
  59.   Cadena apellidos_;
  60.   Cadena direccion_;
  61.   Clave password_;
  62.   /*  
  63.       Tarjetas tarjetas_;*/
  64.   Articulos articulos_;
  65.  
  66.   static set<Cadena> identificadores;
  67.   bool IdValido() const throw(Usuario::Id_duplicado);
  68.   Usuario (const Usuario&); //Deshabilitamos la copia de un usuario
  69. };
  70.  
  71. void mostrar_carro(std::ostringstream&, const Usuario&);
  72. //inline const Tarjetas& tarjetas() const { return tarjetas_; }
  73.  
  74. #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

Última edición por DvNe; 02/04/2014 a las 13:23