Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] Llamada a método dentro de constructor

Estas en el tema de Llamada a método dentro de constructor en el foro de C/C++ en Foros del Web. Buenas, Estoy realizando una clase Tarjeta, la cual tiene el siguiente constructor: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código C++: Ver original #include "tarjeta.h" #include "usuario.h"   using namespace ...
  #1 (permalink)  
Antiguo 02/04/2014, 07:25
 
Fecha de Ingreso: octubre-2012
Mensajes: 37
Antigüedad: 11 años, 6 meses
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
  #2 (permalink)  
Antiguo 03/04/2014, 01:07
 
Fecha de Ingreso: octubre-2012
Mensajes: 37
Antigüedad: 11 años, 6 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é?
  #3 (permalink)  
Antiguo 03/04/2014, 07:10
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 10 meses
Puntos: 61
Respuesta: Llamada a método dentro de constructor

Te falta la implementacion de ese metodo
__________________
Visita mi perfil en LinkedIn
  #4 (permalink)  
Antiguo 03/04/2014, 07:40
 
Fecha de Ingreso: octubre-2012
Mensajes: 37
Antigüedad: 11 años, 6 meses
Puntos: 0
Respuesta: Llamada a método dentro de constructor

Aun no lo he implementado, simplemente puse un cout para ver si entraba en la función pero no sale

Código C++:
Ver original
  1. void es_titular_de(Tarjeta& t) {
  2.   cout << "Titular";
  3. }
  #5 (permalink)  
Antiguo 03/04/2014, 07:48
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 10 meses
Puntos: 61
Respuesta: Llamada a método dentro de constructor

Eso esta dentro de la clase?
Si no es asi, te falta el Usuario:: en la firma del metodo
__________________
Visita mi perfil en LinkedIn
  #6 (permalink)  
Antiguo 03/04/2014, 07:52
 
Fecha de Ingreso: octubre-2012
Mensajes: 37
Antigüedad: 11 años, 6 meses
Puntos: 0
Respuesta: Llamada a método dentro de constructor

Vale si pfff día y medio parado para ver ese fallo TT.TT Mil gracias

Etiquetas: constructor, funcion, llamada, numero, string
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:01.