elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Sigue las noticias más importantes de seguridad informática en el Twitter! de elhacker.NET


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  (Consulta) Definición del operador << para streams
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: (Consulta) Definición del operador << para streams  (Leído 3,363 veces)
class_OpenGL


Desconectado Desconectado

Mensajes: 437

Si usas Direct3D, no eres mi amigo :P


Ver Perfil
(Consulta) Definición del operador << para streams
« en: 29 Noviembre 2015, 01:04 am »

Hola, muy buenas. En mi rato libre, quise mirar un poco el standard de C++. Una cosa de las que he mirado es los operadores definidos para los streams definidos en este (lo he mirado tanto en cplusplus como en el propio archivo de mi compilador MinGW.

Un ejemplo de lo que encontré en el archivo "ostream" es el siguiente:
Código
  1. __ostream_type& operator<<(long __n);

La duda es: ¿No necesita una clase o estructura en los parámetros del operador para ser correcto?

Bueno. Para intentar no tener que preguntar, he hecho el siguiente ejemplo:

Código
  1. #include <cstdio>
  2.  
  3. struct stream {
  4.    int null;
  5. };
  6.  
  7. stream& operator<< (int val);
  8.  
  9. int main() {
  10.    stream ostream = {0};
  11.  
  12.    ostream << 123 << 5;
  13.  
  14.    return 0;
  15. }
  16.  
  17.  
  18. stream& operator<< (int val) {
  19.    printf("%i", val);
  20. }

Pero en las definiciones del operador he tenido que poner esto, porque si no me daba error:

Código
  1. stream& operator<< (stream& ostream, int val);

Esto no esclarece nada :S Gracias por su ayuda!


En línea

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL
do-while


Desconectado Desconectado

Mensajes: 1.276


¿Habra que sacarla de paseo?


Ver Perfil
Re: (Consulta) Definición del operador << para streams
« Respuesta #1 en: 29 Noviembre 2015, 01:52 am »

¡Buenas!

Cuando quieres sobrecargar un operador de entrada/salida lo haces de forma exterior a una clase, ya que el primer operando (cin/cout/fstream/ifstream/ofstream...) va a ser una clase de entrada/salida y el segundo la clase sobre la que quieras que actúe (mira algo sobre sobrecarga de operadores).

En las condiciones anteriores el primer parámetro en la lista de variables que recibe el operador tiene que ser del tipo ajeno a la clase (en este caso un operador de entrada/salida) y si es binario (como lo son los de tipo entrada/salida) el siguiente parámetro tiene que ser del tipo de la clase sobre la que quieres actuar (declarar el operador como friend o no ya es cosa tuya). De hecho el primer parámetro será una referencia a la la clase de entrada/salida, para asegurarte de que los parametrizadores de flujo actúan sobre el, y una vez que acabes de realizar la entrada/salida de la clase tendrás que devolver la referencia al objeto de de entrada/salida que has recibido en la lista de parámetros para poder encadenar entradas/salidas:
Código
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. class UnaClase
  6. {
  7.    public:
  8.        char getVal();
  9.        void setVal(char a);
  10.    private:
  11.        char val;
  12. };
  13.  
  14. char UnaClase::getVal()
  15. {
  16.    return a;
  17. }
  18.  
  19. void UnaClase::setVal(char a)
  20. {
  21.    val = a;
  22. }
  23.  
  24. istream& operator>>(istream &in, UnaClase objeto)
  25. {
  26.    char a;
  27.  
  28.    in >> a; //leemos un caracter desde el flujo de entrada que recibimos
  29.    objeto.setVal(a);
  30.  
  31.    return in; //devolvemos el flujo de entrada que hemos recibido para poder encadenar entradas
  32. }
  33.  
  34. ostream& operator<<(ostream &out, UnaClase objeto)
  35. {
  36.    out << objeto.getVal(); //realizamos la salida sobre el objeto ostream que hemos recibido
  37.    return out; //devolvemos el objeto recibido para poder encadenar salidas
  38. }
  39.  
  40. int main()
  41. {
  42.    UnaClase obj1,obj2;
  43.  
  44.    cin >> obj1 >> obj2;
  45.    //lo anterior implica:
  46.    //cin.>>(obj1) y es lo que hemos sobrecargada como >>(cin,obj1) que devuelve una refecencia a cin
  47.    //utilizamos la referencia que hemos devuelto a cin para ejecutar cin.>>(obj2) = >>(cin,obj2)
  48.  
  49.    cout << obj1 << obj2;
  50.    //el razonamiento es como antes pero sobre cout
  51.  
  52.    return 0;
  53. }
  54.  

¡Saludos!


« Última modificación: 2 Diciembre 2015, 04:29 am por do-while » En línea

- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!
class_OpenGL


Desconectado Desconectado

Mensajes: 437

Si usas Direct3D, no eres mi amigo :P


Ver Perfil
Re: (Consulta) Definición del operador << para streams
« Respuesta #2 en: 29 Noviembre 2015, 02:02 am »

He entendido por qué se debe retornar el objeto de flujo, pero no entiendo como tu respuesta resuelve mi duda :S Aun así, gracias por tu rápida respuesta :D

Por cierto, a lo mejor es que no entiendo/sé suficiente C++, pero ¿y esta estructura?

Código
  1. istream& >>(istream &in, UnaClase objeto)

Parece la estructura de sobrecarga de un operador, pero no tiene la keyword 'operator'. ¿Significa otra cosa?
En línea

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL
do-while


Desconectado Desconectado

Mensajes: 1.276


¿Habra que sacarla de paseo?


Ver Perfil
Re: (Consulta) Definición del operador << para streams
« Respuesta #3 en: 29 Noviembre 2015, 02:05 am »

Cuanta razón tienes, hace mucho que no toco C++ y se me ha olvidado poner la palabra clave operator. El código correcto sería:

Edit: En lugar de volver a escribir todo el código en este post he corregido el anterior. (Tiene más lógica)

¡Saludos!
« Última modificación: 2 Diciembre 2015, 04:28 am por do-while » En línea

- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!
class_OpenGL


Desconectado Desconectado

Mensajes: 437

Si usas Direct3D, no eres mi amigo :P


Ver Perfil
Re: (Consulta) Definición del operador << para streams
« Respuesta #4 en: 29 Noviembre 2015, 02:13 am »

Jajaja. Un error lo tiene cualquiera :D Pero no he llegado a entender tu explicación D: No digo que esté mal explicada, solo digo que no sé como resuelve mi duda!
En línea

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL
do-while


Desconectado Desconectado

Mensajes: 1.276


¿Habra que sacarla de paseo?


Ver Perfil
Re: (Consulta) Definición del operador << para streams
« Respuesta #5 en: 29 Noviembre 2015, 02:38 am »

La cuestión es que cuando quieras sobrecargar un operador tienes que tener clara una (dos) cosa(s):

1. Si el primer operando (el que está más a la izquierda) es de la clase o no.
1.1 Si no es de la clase sobre la que estás trabajando el operador no puede ser un miembro de la clase:
Código
  1. class MiEntero
  2. {
  3.    public:
  4.        //...
  5.    private:
  6.        int x;
  7. };
  8.  
  9. /* si queremos sumar un entero y un elemento de mi clase, como el entero no es un objeto de mi clase, tendré que declarar el operador suma fuera de la clase.
  10.  
  11.  La suma es un operador binario y el elemento más a la izquierda es de clase entero, luego a la hora de sobrecargarlo la lista de parámetros tendrá dos valores,
  12. un entero y un elemento de la clase y devolveré un elemento de mi clase, que engloba a los enteros y así mantengo las reglas de promoción:*/
  13. //...
  14.  
  15. MiEntero operator+ (int op1, MiEntero &op2) //pasamos una referencia al objeto de la clase para evitar sobrecargar la pila
  16. {
  17.    //me las arreglo para generar un elemento MiEntero que almacene el valor suma y devuelvo este objeto
  18. }
  19.  
  20. /*a la hora de llamar al operador, x+y con x entero e y un objeto de mi clase, se genera una llamada operator+(x,y)*/
  21.  
1.2 Si el objeto más a la izquierda es de la clase tenemos dos opciones:
1.2.1. Declarar el operador fuera de la clase con una lista de dos parámetros, ambos de la clase con la que estamos trabajando (igual que antes).
1.2.2. Declarar el operador como miembro de la clase, con un solo parámetro de la clase. La llamada a operador suma, x + y con los dos operandos objetos de mi clase, generará una llamada x.operator+(y), así que para hacer referencia a x dentro de la definición del operador tendrás que utilizar el puntero this:
Código
  1. class MiEntero
  2. {
  3.    public:
  4.        //...
  5.        MiEntero operator+(MiEntero &op2); //como la lista de parámetros es distinta a la la del operador exterior no incumplo las reglas de sobrecarga de funciones/operadores
  6.    private:
  7.        int x;
  8. };
  9.  
  10. MiEntero MiEntero::operator+(MiEntero &op2)
  11. {
  12.    MiEntero res;
  13.  
  14.    res.x = this->x + op2.x;
  15.  
  16.    return res;
  17. }
  18.  
  19. /* si queremos sumar un entero y un elemento de mi clase, como el entero no es un objeto de mi clase, tendré que declarar el operador suma fuera de la clase.
  20.  
  21.  La suma es un operador binario y el elemento más a la izquierda es de clase entero, luego a la hora de sobrecargarlo la lista de parámetros tendrá dos valores,
  22. un entero y un elemento de la clase y devolveré un elemento de mi clase, que engloba a los enteros y así mantengo las reglas de promoción:*/
  23. //...
  24.  
  25. MiEntero& operator+ (int op1, MiEntero &op2) //pasamos una referencia al objeto de la clase para evitar sobrecargar la pila
  26. {
  27.    //me las arreglo para generar un elemento MiEntero que almacene el valor suma y devuelvo este objeto
  28. }
  29.  

La segunda opción sería declarar los operadores exteriores a la clase como friend para poder tener un acceso inmediato a sus miembros privados.

¡Saludos!
En línea

- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!
class_OpenGL


Desconectado Desconectado

Mensajes: 437

Si usas Direct3D, no eres mi amigo :P


Ver Perfil
Re: (Consulta) Definición del operador << para streams
« Respuesta #6 en: 29 Noviembre 2015, 03:00 am »

Ahhhh. Creo que ya lo entiendo!!! Muchísimas gracias por tus respuestas :DD
En línea

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL
class_OpenGL


Desconectado Desconectado

Mensajes: 437

Si usas Direct3D, no eres mi amigo :P


Ver Perfil
Re: (Consulta) Definición del operador << para streams
« Respuesta #7 en: 29 Noviembre 2015, 03:13 am »

De hecho, acabo de ponerlo en práctica para ver si lo entendí, y todo bien. Muy buenas tus respuestas :D
En línea

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL
do-while


Desconectado Desconectado

Mensajes: 1.276


¿Habra que sacarla de paseo?


Ver Perfil
Re: (Consulta) Definición del operador << para streams
« Respuesta #8 en: 29 Noviembre 2015, 05:51 am »

De nada hombre, da gusto contar con gente como tu.

¡Saludos!
En línea

- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines