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

[SOLUCIONADO] operator<<

Estas en el tema de operator<< en el foro de C/C++ en Foros del Web. Buenas. Vuelvo al ruedo con esto de C++, y me encuentro con que no se hacer correctamente el operator<<. Fui a algunos foros y copie ...
  #1 (permalink)  
Antiguo 27/12/2013, 07:09
 
Fecha de Ingreso: noviembre-2008
Mensajes: 12
Antigüedad: 15 años, 5 meses
Puntos: 0
Pregunta operator<<

Buenas.
Vuelvo al ruedo con esto de C++, y me encuentro con que no se hacer correctamente el operator<<. Fui a algunos foros y copie y pegue explicaciones, pero no anda. Que no estoy viendo?

Código:
Racional.hpp:14:9: error: ‘ostream’ in namespace ‘std’ does not name a type
  friend std::ostream& operator<< (std::ostream& stream, const Racional& elem);
         ^
.h
Código C++:
Ver original
  1. /**
  2.   * Racional.hpp
  3. */
  4. #ifndef __RACIONAL__
  5. #define __RACIONAL__
  6.  
  7. using namespace std;
  8.  
  9. class Racional
  10. {
  11. public:
  12.     Racional();
  13.     Racional(long numerador, long denominador);
  14.     Racional(const Racional& copia);
  15.    
  16.     friend std::ostream& operator<< (std::ostream& stream, const Racional& elem);
  17.  
  18. [...]
  19.  
  20. private:
  21.    
  22.     long Num;
  23.     long Den;
  24.    
  25.     long mcd(long a, long b);
  26. };
  27.  
  28. #endif

.cpp

Código C++:
Ver original
  1. /**
  2.    * Racional.cpp
  3. */
  4.  
  5. #include <iostream>
  6. #include <cmath>
  7. #include "Racional.hpp"
  8.  
  9. using namespace std;
  10.  
  11. [...]
  12.  
  13. std::ostream& operator<< (std::ostream& stream, const Racional& elem)
  14. {
  15.     stream << elem.Num << "/" << elem.Den; //necesito friend para usar Num y Den q son privados
  16.     return stream;
  17. }

Lo mas triste es que he c&p de gente q dice que esta es la posta. No se :(
  #2 (permalink)  
Antiguo 27/12/2013, 08:40
Avatar de rflorez  
Fecha de Ingreso: diciembre-2013
Ubicación: Argentina
Mensajes: 14
Antigüedad: 10 años, 4 meses
Puntos: 0
Respuesta: operator<<

Prueba con #include <ostream>
  #3 (permalink)  
Antiguo 29/12/2013, 13:24
 
Fecha de Ingreso: noviembre-2008
Mensajes: 12
Antigüedad: 15 años, 5 meses
Puntos: 0
Respuesta: operator<<

Cita:
Iniciado por rflorez Ver Mensaje
Prueba con #include <ostream>
No, iostream incluye a ostream, istream y otros.

De todas formas lo probé :P y no lo soluciona.



Como nunca entendí bien el tema tengo la sospecha que podría tener que ver con el namespace. Algún alma caritativa y conocedora del tema que me ilumine? :)

Última edición por Pernoctador; 29/12/2013 a las 14:47 Razón: para no hacer otra respuesta a lo mismo
  #4 (permalink)  
Antiguo 29/12/2013, 18:34
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 7 meses
Puntos: 10
Respuesta: operator<<

Creo que el error se refiere a que en el fichero *.hpp no se define el tipo ostream, porque no has incluido allí iostream

El hecho de que lo acote al namespace std es porque estas definiendo el tipo con el operador de ámbito:
Código C++:
Ver original
  1. std::ostream,
por lo que el compilador asume que ese tipo está definido en el namespace std, y puede tal vez hacer pensar que el error es algo relacionado con namespace

Si incluyes la librería iostream en el fichero *.h deberías no tener ese problema. De paso la puedes quitar del fichero *.cpp.

Y por último, si defines que estas en el namespace std, es redundante definir los tipos pertenecientes con el operador de ámbito...vamos, que te puedes evitar anteceder el std:: antes de los tipos. (o dejarlo así y no definir el namespace std)

Saludos y espero no haber metido la pata con la respuesta
  #5 (permalink)  
Antiguo 30/12/2013, 13:13
 
Fecha de Ingreso: noviembre-2008
Mensajes: 12
Antigüedad: 15 años, 5 meses
Puntos: 0
Respuesta: operator<<

Cita:
Iniciado por dehm Ver Mensaje
Creo que el error se refiere a que en el fichero *.hpp no se define el tipo ostream, porque no has incluido allí iostream

[...]

Si incluyes la librería iostream en el fichero *.h deberías no tener ese problema. De paso la puedes quitar del fichero *.cpp.

[...]
Veamos veamos... lo que decis suena a ser la solucion.. lastima que no es tan asi xD

Código:
In file included from Racional.cpp:3:0:
Racional.hpp: In function ‘std::ostream& operator<<(std::ostream&, const Racional&)’:
Racional.hpp:69:10: error: ‘long int Racional::Num’ is private
     long Num;
          ^
Racional.cpp:395:17: error: within this context
  stream << elem.Num << "/" << elem.Den;
                 ^
In file included from Racional.cpp:3:0:
Racional.hpp:70:10: error: ‘long int Racional::Den’ is private
     long Den;
          ^
Racional.cpp:395:36: error: within this context
  stream << elem.Num << "/" << elem.Den;
                                    ^
Para mi tiene sentido lo que me dijiste, pero ahora me sale este error :(
Intenté pasar Num y Den con funciones pero tampoco anda

Código C++:
Ver original
  1. long num(){return Num;}
  2. long den(){return Den;}

y

Código C++:
Ver original
  1. const long num(){return Num;}
  2. const long den(){return Den;}

En esos casos lo que me dice es que se viola el const Racional que paso como parámetro a la función -.-
  #6 (permalink)  
Antiguo 30/12/2013, 13:50
 
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
  #7 (permalink)  
Antiguo 31/12/2013, 08:51
 
Fecha de Ingreso: noviembre-2008
Mensajes: 12
Antigüedad: 15 años, 5 meses
Puntos: 0
Respuesta: operator<<

Cita:
Iniciado por dehm Ver Mensaje
Hola:


[...]


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
Gracias por la aclaracion del const, siempre me confundo con eso :)
[U]

Pude solucionarlo! :D

Les cuento que en algún momento, luego de la ultima corrección a mi codigo me quedo: friend ostream& operator<<(ostream& stream, const Racional& elem);

Si no lo ven, me faltaba un espacio -.-


Muchisimas gracias a todos los que contestaron y se metieron a leer este tema :D.

Etiquetas: c++, class
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 22:59.