Newsgroup: it.comp.lang.c++
Titolo: Override operatore << su classe

Ciao a tutti,
sto cercando di fare un override dell'operatore "<<" di una classe da
me derivata, non posto tutto il codice, solo le parti fondamentali:
class mystream : public ofstream {
    bool bLog;
public:
    mystream &operator<<(const char *buffer);
};
dove << è definito come:
mystream &mystream::operator<<(const char *buffer) {
    if (bLog) {
        cout << "DEBUG, le mie operazioni..." << buffer << endl;
        *this << buffer;    // <---------------- QUESTA è da mettere a
posto
    }
}
come avrete sicuramente capito devo creare una mia classe che fa
logging a modo mio, non utilizzare qualche cosa di già fatto. Il fatto
è che ho derivato da "ofstream" in modo da avere un oggetto file, ora
però su override dell'operatore devo eseguire alcune operazioni (il
cout è puramente per debug) ed alla fine chiamare il metodo originale
di ofstream per andare a scrivere realmente su file.
So che magari è una cosa banale ma c'è qualcuno che sa come scriverla
con la sintassi corretta ? scritta in quel modo il metodo richiama se
stesso in modo ricorsivo (nella stessa classe), io avrei bisogno di
chiamare il metodo del padre ofstream (dove ho scritto *this <<
buffer).
Sto utilizzando il Gcc 2.95 per Linux ma penso che la domanda è di
carattere generale e non legata ad un compilatore specifico
Grazie in anticipo per le risposte
Ben

 me derivata,
ostream::operator<< non è virtual, quindi non puoi fare l'override.
Max

 
ma perchč non ti basta ridefinire solo l'operatore << ? una cosa tipo:
std::ostream &
operator << (std::ostream & os, const MyObject & obj)
{
	return os << obj.dump();
}
in ogni caso non credo che specializzare ofstream sia l'approccio 
corretto, anche perchč buona parte delle classi std non sono progettate 
per tale scopo
-- 
"E' solo dopo aver perso tutto che siamo liberi di fare qualsiasi cosa."

Grazie ad entrambi per la risposta,
il mio punto di arrivo è creare un classe per fare log delle
operazioni del mio programma, non volendo scrivere troppo codice e
volendo lasciare la sintassi la più semplice possibile stavo provando
ad estendere ofstream anche se chiaramente, come avete sottolineato la
std non è stata fatta per essere stravolta.
Dal punto di vista pratico ho la necessità di fare un log stile syslog
di UNIX, quindi data-ora iniziale, nome del modulo che logga, messaggio
di log; il tutto su un mio file di testo aperto in out con append; la
ofstream è perfetta allo scopo, mi permette di aprire un file,
controllarlo, ecc... ed utilizzare gli operatori << per inserire dati,
il tutto con una sintassi molto pulita. Qualche cosa del tipo:
Log(LOGINFO) << "Messaggio di Log, stringa s=" << sString << endl;
ho definito "()" in modo da poter mettere data/ora ed una stringa
(info, warning, ...), poi chiaramente vorrei appendere il messaggio.
Utilizzavo le Common C++ libs ma non volendo scrivere su syslog e
volendo rimanere svincolato dal sistema operativo ho deciso di
scrivermi una classe per conto mio, qualche idea per utilizzare gli
operatori << o è meglio che mi inventi un metodo simile che comunque
mantenga una sintassi pulita ?
Grazie ancora
Ben

 std non č stata fatta per essere stravolta.
leggi un po' quě: 
http://tinyurl.com/dw4zx
magari ti puň essere d'aiuto x decidere


 std non è stata fatta per essere stravolta.
Non è esattamente vero. L'architettura degli stream I/O contempla la 
possibilità di estensione. Questa però non si realizza mediante override 
delle funzioni di ostream/istream, bensi tramite la definizione di un 
appropriato streambuf, derivando da std::streambuf e ridefinidendo 
(override) determinate funzioni (overflow e sync, di solito, ma anche 
xpuntn e altre). La cosa non si spiega in due parole (e io non sono 
comunque un esperto di stream), ma non credo sia difficile trovare 
materiale in rete.
Max

SPETTACOLARE !
Con i vostri consigli e Google ho trovato effettivamente un pò di
materiale, ho risolto la faccenda come suggerito:
- Creato una classe derivata di streambuf modificando principalmente
overflow e sync, ho letto qualche cosa di xpuntn ma da quello che ho
visto anche se non la derivo è uguale
- inizializzato la classe ostream con esso, in alternativa ho visto che
anche rdbuf() va bene (quando ad esempio la ostream è proprietà di
un'altra classe)
- per variare il livello di log della mia classe ostream continuo ad
utilizzare la derivata di streambuf, magari non è elegante ma funziona
Ora riesco ad utilizzare la potenza della ostream formattando e
gestendo i messaggi in output come credo
Grazie ragazzi.
Ben

Posteresti il materiale che ti e' stato utile ?? Magari potrebbe essere 
interessante !
Ciao e grazie !