/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

Pasar 'this' como parametro

 
      Índice del Foro elrincondelc.com -> C/C++ en General
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
DvNe



Registrado: 02 Abr 2014
Mensajes: 5

MensajePublicado: 02/04/2014 11:39 am
Título: Pasar 'this' como parametro

Buenas,

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

Código:
#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:
#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:
#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
[/code]
Volver arriba
daltomi



Registrado: 28 Abr 2007
Mensajes: 335
Ubicación: Argentina

MensajePublicado: 02/04/2014 4:39 pm
Título:

La función es_titular_de() debe ser constante, porque const Usurario& user es constante.
Es decir, le habías prometido al compilador que no modificarías user.
Opcion 1, en Usuario:
Código:
void es_titular_de(Tarjeta&) const { }


Opcion 2, en el ctor. de Tarjeta:
Código:
const_cast<Usuario&>(user).es_titular_de(*this);


Saludos.
Volver arriba
Dirección AIM
DvNe



Registrado: 02 Abr 2014
Mensajes: 5

MensajePublicado: 02/04/2014 10:44 pm
Título:

He probado la segunda opción puesto que no puedo modificar la definición de la función es_titular_de(). Este es el código resultante:

Código:

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);
}


Pero me sale el siguiente error:

tarjeta.o: In function `Tarjeta::Tarjeta(Numero const&, Usuario const&, Fecha const&)':
tarjeta.cpp:(.text+0x1bd): undefined reference to `Usuario::es_titular_de(Tarjeta&)'
Volver arriba
daltomi



Registrado: 28 Abr 2007
Mensajes: 335
Ubicación: Argentina

MensajePublicado: 03/04/2014 9:06 am
Título:

Así, ha simple vista, la función esta declarada pero no definida.
Código:

class Usuario {
   void es_titular_de(Tarjeta&);  //declaración
};


Código:

void Usuario::es_titular_de(Tarjeta& t) { ... } // definición
Volver arriba
Dirección AIM
DvNe



Registrado: 02 Abr 2014
Mensajes: 5

MensajePublicado: 03/04/2014 1:34 pm
Título:

Si llevas razón ya lo termine muchas gracias.

Saludos
Volver arriba
      Índice del Foro elrincondelc.com -> C/C++ en General
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com