Tema: operator<<
Ver Mensaje Individual
  #6 (permalink)  
Antiguo 30/12/2013, 13:50
dehm
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 7 meses
Puntos: 10
Respuesta: operator<<

Hola:

Parece que el error se refiera a que la función que sobrecarga << no tenga acceso a los miembros privados de la clase.¿Puede ser que le quitaras la declaración de friend?

Te pongo un ejemplo que debería de funcionarte, a ver si puedes detectar el error

Fichero h:

Código C++:
Ver original
  1. #ifndef RACIONAL_H
  2. #define RACIONAL_H
  3.  
  4. #include <iostream>
  5.  
  6. using namespace std;
  7.  
  8. class Racional
  9. {
  10. public:
  11.     Racional():Num(1),Den(1) {}
  12.     Racional(long numerador, long denominador):Num(numerador),Den(denominador) {}
  13.     Racional(const Racional& copia);
  14.     long int LeeNum()const{return Num;}
  15.     long int LeeDen()const{return Den;}
  16.  
  17.  
  18.     friend ostream& operator<< (ostream& stream, const Racional& elem);
  19.  
  20. private:
  21.  
  22.     long int Num;
  23.     long int Den;
  24.     long int mcd(long a, long b);
  25. };
  26.  
  27.  
  28. #endif // RACIONAL_H

Fichero cpp:
Código C++:
Ver original
  1. #include "../include/Racional.h"
  2.  
  3. ostream& operator<< (ostream& stream, const Racional& elem)
  4. {
  5.     stream << elem.Num << "/" << elem.Den; //necesito friend para usar Num y Den q son privados
  6.     return stream;
  7. }

Un main para ver si funciona la cosa

Código C++:
Ver original
  1. #include "./include/Racional.h"
  2.  
  3. int main()
  4. {
  5.     Racional valor;
  6.     cout<<valor.LeeNum()<<endl;
  7.     cout<<valor.LeeDen()<<endl;
  8.     cout<<valor<<endl;
  9.     Racional valor2(10,20);
  10.     cout<<valor2<<endl;
  11.     return 0;
  12. }

Respecto a la cláusula const, si defines la función como:
Código C++:
Ver original
  1. const long num(){return Num;}

Lo que le estás diciendo es que retorne un const long. Como Num es del tipo long, pues se quejará. (no hay que confundir long con const long). C/C++ es un lenguaje fuertemente tipado y no pasa ni una )

Para asegurarse de que la función no modifica el valor que lee, y que sólo lo devuelve, has de declararla así:
Código C++:
Ver original
  1. long int LeeNum()const{return Num;}

(bueno, verás que el tipo es long int y que le he cambiado el nombre, pero igualmente:
Código C++:
Ver original
  1. long num()const{return Num;}


Saludos