Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: k3r00t en 5 Julio 2012, 18:23 pm



Título: [?] Error passing xxx as 'this' argument of xxx discards qualifiers
Publicado por: k3r00t en 5 Julio 2012, 18:23 pm
Estoy sobrecargando el operador de asignación en una clase fecha que he creado y me lanza este error. La primera vez compilo y me funciono perfecto, luego me empezo a aparecer este error y no tengo ni idea. Creo que el error viene dado por llamar como const a algo que no lo es, si me pueden ayudar se los agradeceria!

Código
  1. #ifndef FECHA_H
  2. #define FECHA_H
  3. #include <iostream>
  4.  
  5. using namespace std;
  6.  
  7. class Fecha
  8. {
  9.  //Atributos de la clase
  10.  private:
  11.    int dia,mes,ano;
  12.  //Metodos de la clase
  13.  public:
  14. Fecha() : dia(0),mes(0),ano(0){};
  15. Fecha(int dia_,int mes_,int ano_) : dia(dia_),mes(mes_),ano(ano_){};
  16. Fecha(Fecha &F);
  17. void set_dia(int dia_);
  18. void set_mes(int mes_);
  19. void set_ano(int ano_);
  20. int get_dia();
  21. int get_mes();
  22. int get_ano();
  23.        Fecha& operator=(const Fecha&f); // operador de asignación
  24. ~Fecha();
  25. //Sobrecarga del operador <<
  26. friend ostream& operator<<(ostream &os,const Fecha &F){
  27.  
  28.        os << F.get_dia() << "/" << F.get_mes() << "/" << F.get_ano() << endl;
  29.        return(os);
  30. }
  31. };
  32.  
  33. /* Definicion de metodos*/
  34.  
  35. //Modificar el dia
  36. void Fecha::set_dia(int dia_){dia = dia_;}
  37. //Modificar el mes
  38. void Fecha::set_mes(int mes_){mes = mes_;}
  39. //Modificar el ano
  40. void Fecha::set_ano(int ano_){ano = ano_;}
  41. //Obtener el dia
  42. int Fecha::get_dia(){return dia;}
  43. //Obtener el mes
  44. int Fecha::get_mes(){return mes;}
  45. //Obtener el ano
  46. int Fecha::get_ano(){return ano;}
  47. //Constructor copia
  48. Fecha::Fecha(Fecha &F)
  49. {
  50.  dia = F.get_dia();
  51.  mes = F.get_mes();
  52.  ano = F.get_ano();
  53. }
  54. //Operador de asignacion
  55. Fecha& Fecha::operator=(const Fecha&f){
  56.  
  57.   if(this != &f){
  58.      this->set_dia(f.get_dia());
  59.      this->set_mes(f.get_mes());
  60.      this->set_ano(f.get_ano());    
  61.  
  62.   }  
  63.   return *this;    
  64. }
  65. //Destructor
  66. Fecha::~Fecha(){}
  67. #endif  //FECHA_H


Título: Re: [?] Error passing xxx as 'this' argument of xxx discards qualifiers
Publicado por: do-while en 5 Julio 2012, 18:50 pm
¡Buenas!

Si mal no recuerdo, para que para poder utilizar funciones miembro sobre objetos constantes tienes que añadir el calificador const despues del prototipo de la funcion. Esto estara indicando que la funcion no modifica los atributos de la clase. Si una funcion modifica estos atributos no podras delararla constante, y no podras untilizarla sobre objetos constantes, pero los metodos get si que podras utilizarlos, por lo que los prototipos deberian de ser:
Código
  1. int get_dia() const;
  2. int get_mes() const;
  3. int get_ano() const;
  4.  

Prueba a hacer este cambio y nos cuentas.

¡Saludos!

PD: Tambien tienes que añadir el const cuando implementes las fuciones:
Código
  1. int Fecha::get_dia() const {//tu codigo}
  2. int Fecha::get_mes() const {//tu codigo}
  3. int Fecha::get_ano() const {//tu codigo}
  4.  


Título: Re: [?] Error passing xxx as 'this' argument of xxx discards qualifiers
Publicado por: k3r00t en 5 Julio 2012, 18:56 pm
¡Buenas!

Si mal no recuerdo, para que para poder utilizar funciones miembro sobre objetos constantes tienes que añadir el calificador const despues del prototipo de la funcion. Esto estara indicando que la funcion no modifica los atributos de la clase. Si una funcion modifica estos atributos no podras delararla constante, y no podras untilizarla sobre objetos constantes, pero los metodos get si que podras utilizarlos, por lo que los prototipos deberian de ser:
Código
  1. int get_dia() const;
  2. int get_mes() const;
  3. int get_ano() const;
  4.  

Prueba a hacer este cambio y nos cuentas.

¡Saludos!

PD: Tambien tienes que añadir el const cuando implementes las fuciones.

Efectivamente eso era, lo peor es que lo había hecho antes y no lo recordaba jaja, Muchas gracias!!