pequeña duda de c++

hi
A ver, tengo una clase en la q sobrecargo el operador <<. Como miembro de la clase tengo el ofstream mFile, q es a donde quiero enviar lo q me mandan con el operador. Pongo q lo devuelva para poder usarlo varias veces en una misma instruccion, tipo clase << "hola" << "mundo";.

ofstream& CClass::operator<<( const char* pText ) {
mFile << pText << endl;
return mFile;
}

Me gustaria q al final, despues de escribir todo lo q se le envia, se escriba ese endl, pq ahora mismo, lo siguiente:

clase<<"Hola "<< "Mundo";
clase<<"Prueba2";

me muestra esto:

Hola
MundoPrueba2

Siempre me escribe la primera cadena, me pone el endl, y sigue escribiendo el resto de strings sin escribir ningun salto de linea mas.

Como se haria? Q orden sigue al procesar la sentencia clase<<"Hola "<< "Mundo"; para q ese endl salga donde sale?

Es una tonteria, pero hace unos años q no toco el c++ y estoy bastante oxidado...
El problema es que devuelves el stream, cuando deberias devolver tu objeto.

asi que, donde haces:

return mFile;

deberias poner:

return *this;

Asi, cambiando solo eso, la salida que obtendrias en tu ejemplo seria:

Hola
Mundo
Prueba2

EDIT: Por supuesto ahora tendrias que cambiar:

ofstream& CClass::operator<<( const char* pText ) {

por:

CClass& CClass::operator<<( const char* pText ) {
Hay una cosa de lo q has dicho q no tenia presente, y me ha hecho recordar otra cosa q ahora mismo no tenia clara, thx :)
De todas maneras no era lo q queria hacer con el programa. El salto de linea me interesaria q se escribiera despues de todo lo enviado, no despues de cada cadena individual. Si escribo esto en el main:

clase<<"Hola "<< "Mundo";

lo q en realidad quiero q ocurra es esto:

this->funcion();
mFile<<"Hola "<<"Mundo"<
Quizas podria ponerlo con una macro, pero ya tendria q pasar la clase como un parametro mas y me gustaria q la cosa quedara simple, como la instruccion q he puesto en el main. O usar el operator tal y como lo tenia, devolviendo el stream, pero con la llamada a la funcion y el endl antes q la cadena, pero prefiero q el salto de linea quede al final.
Ves q se pueda hacer esto tal y como quiero? (yo casi q diria q no...)
No se puede hacer, porque para tu clase, cada llamada al operador << es igual que cualquier otra. Por tanto, o pones el salto de linea siempre o nunca. Asi que la opcion seria hacer que le puedas pasar la funcion endl al operador <<. Esto lo harias asi:

CClass &operator <<(ofstream &(*f)(ofstream &))
{
f(mFile);
return *this;
}

De forma que ya podrias hacer esto:

CClass class;
class << "Hola" << "Mundo" << endl;
ayer estube un rato probando, pero no consegui hacer q funcionara. Tal cual lo has puesto, se me queja en el main diciendo q no hay operator en la clase q acepte ese endl. Mirando por webs no paro de encontrarme con exactamente el mismo codigo, asi q no se hago mal... alguna sugerencia?
Si, perdona, la cague con el codigo.

Seria asi:

CClass &operator <<(basic_ostream &(*f)(basic_ostream &))
{
f(mFile);
return *this;
}

Este codigo deberia funcionar perfectamente.

Pero, a lo mejor si tu clase ES un stream, seria mejor que heredaras de ofstream, en lugar de reimplementar estos metodos.
lo de heredar ya lo habia pensado... pero no se, de momento lo pondre asi, tampoco tendre q reimplementar todo, creo, y sino ya cambiare, segun como vea...

muchas gracias [oki]
Vale, solo una cosa:

En la funcion que te he puesto, el char_type y el traits_type de un ofstream son los mismos de un ostream, asi que simplemente puedes cambiar

basic_ostream

por

ostream

Lo puse asi por si alguna vez cambias el ofstream por algun otro tipo de stream. Si no lo vas a cambiar puedes sustituir ese tocho simplemente por ostream (ostream, no ofstream, no es un error), y asi te quedara un poco mas legible el asunto.
7 respuestas