Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: ElRodrik en 26 Mayo 2015, 13:32 pm



Título: No puedo sobrecargar el operador ostream
Publicado por: ElRodrik en 26 Mayo 2015, 13:32 pm
Buenas. He declarado en un archivo "Partit.h" las clases y ahora en el archivo ".cpp" me sale el error "expected initializer before '&' token". Para escribir el programa estoy usando el Dev.
El código es el siguiente:

#include <Partit.h> //éste es el archivo donde tengo las clases declaradas

#include <iomanip>
#include <iostream>
using namespace std;

CPartit
CPartit::ostream& operator<< (ostream& os, const CPartit&) //el error sale en el primer "&" de ésta línea
{
os << local << gols_local << ':' << visitant << gols_visitant;
return os;
}


Título: Re: No puedo sobrecargar el operador ostream
Publicado por: Peregring-lk en 26 Mayo 2015, 17:25 pm
Has puesto la resolución de ámbito mal:

Código
  1. #include <Partit.h> //éste es el archivo donde tengo las clases declaradas
  2.  
  3. #include <iomanip>
  4. #include <iostream>
  5. using namespace std;
  6.  
  7. ostream& CPartit::operator<<(ostream& os, const CPartit&)
  8. {
  9.    os << local << gols_local << ':' << visitant << gols_visitant;
  10.    return os;
  11. }


Título: Re: No puedo sobrecargar el operador ostream
Publicado por: do-while en 27 Mayo 2015, 20:42 pm
¡Buenas!

Para sobrecargar operadores cuyo operando mas a la izquierda no es un miembro de la clase tienes que declararlos como friend, no como miembros de la clase, ya que en este ultimo caso se espera que el operando mas a la izquierda sea del tipo de la clase.

¡Saludos!


Título: Re: No puedo sobrecargar el operador ostream
Publicado por: Peregring-lk en 27 Mayo 2015, 21:10 pm
Eso no es cierto. Un operador o una función se hacen friend[/i] cuando:

  • El operador o función debe ser externo a la clase por la cuestión que sea.
  • El operador o función, además, necesita acceder a los datos privados de la clase.

Y no por el sencillo hecho de ser "un operador cuyo operando más a la izquierda no es un miembro de la clase". Un operador se podría hacer externo a la clase, "cuyo operando más a la izquierda ES un miembro de la clase", sencillamente para permitir conversiones implícitas.

Si no necesitas acceder a los datos privados, puedes hacer tu operador externo a la clase sin problemas, tal y como he puesto (aunque no sé qué son `local`, ni `gols_local`, ni `visitant`; asumo que subobjetos de un partido --es obvio; pero como no lo ha explicado, pues lo he dejado "tal cuál"; me he centrado en la sintáxis; si son datos privados, que sustituya su acceso mediante métodos lectores o que la haga friend como bien dices).


Título: Re: No puedo sobrecargar el operador ostream
Publicado por: do-while en 28 Mayo 2015, 03:30 am
Eso no es cierto. Un operador o una función se hacen friend[/i] cuando:

  • El operador o función debe ser externo a la clase por la cuestión que sea.
  • El operador o función, además, necesita acceder a los datos privados de la clase.

Y no por el sencillo hecho de ser "un operador cuyo operando más a la izquierda no es un miembro de la clase". Un operador se podría hacer externo a la clase, "cuyo operando más a la izquierda ES un miembro de la clase", sencillamente para permitir conversiones implícitas.

A ver si aprendemos a leer. He dicho que si el operador mas a la izquierda no es un objeto de la clase (y evidentemente el operador tiene que acceder a los miembros privados, como el mismo está intentando hacer (no hace falta tener muchas luces para darse cuenta)) entonces tiene que declararlo como friend y un operador miembro "puro", no friend, exige que su operando mas a la izquierda sea un objeto de la clase. Y esto, lo mires como lo mires, es cierto siempre. Otra cosa es que haya más casos en los que un operador/funcion se pueda declarar friend, o que pueda aceptar como primer operando un objeto de la clase, pero lo que he dicho es completamente cierto.

Primero lee, luego entiende y cuando hayas hecho todo lo anterior reflexiona antes de opinar sobre lo que ha dicho otra persona, sobre todo si pretendes desacreditarla, no vaya a ser que acabes pillándote los dedos.

¡Saludos!


Título: Re: No puedo sobrecargar el operador ostream
Publicado por: Peregring-lk en 28 Mayo 2015, 04:07 am
Pero no te enfades xD (sé que en realidad no te enfadas). Y perdona, a veces soy muy precipitado... cosas del dormir poco.