Newsgroup: it.comp.lang.c++
Titolo: visual C++ 6.0 (overloading operatore <<)

Qualcuno sa dirmi come dichiarare friend di una classe l'operatore di
output, in modo da potere accedere alla parte privata di questa?
#include <iostream>
using namespace std;
class classe{
.....
public:
    .........
    .........
    friend ostream&operator<<(ostream&, const classe&);
};
il compilatore mi da un errore, perchè l'operatore << non può accedere
alla parte privata della classe.
Il problema è sicuramente dovuto al namespace, ma come risolverlo?
Grazie in anticipo
Luca Luccarini

 alla parte privata della classe.
C'e' qualcosa che non va col tuo compilatore; questo e' C++ correttissimo.
MLO@axcdf4 18 $ cat z.cxx # Sorgente
#include <iostream>
using namespace std;
class classe {
  private:
    int _i;
  public:
    classe(const int i=0) throw() : _i(i) { cout << "ctor\n"; };
    ~classe() throw() { cout << "dtor\n"; };
    friend ostream & operator << (ostream &, const classe &);
};
ostream & operator << (ostream & o, const classe & c) {
  cout << "operator << : " << c._i ; return o;
}
int main() {
  classe c(42); cout << c << endl;
}
MLO@axcdf4 19 $ KCC -o z z.cxx # Compilazione+linking
MLO@axcdf4 20 $ ./z # esecuzione
ctor
operator << : 42
dtor
MLO@axcdf4 21 $
-- 
Maurizio Loreti                         
http://www.pd.infn.it/~loreti/mlo.html
Univ. of Padova, Dept. of Physics - Padova, Italy            
lor...@pd.infn.it

 Il problema è sicuramente dovuto al namespace, ma come risolverlo?
Non mi pare ci sia nessun errore in questo codice.  Tra l'altro,
non si vede come potrebbe esserci, visto che l'operator<< non
lo definisci e neppure lo invochi mai; come potrebbe il compilatore
darti errore sulla parte di codice che ci riporti...?!
Comunque l'idioma piu` consigliabile per operator<< evita i
friend, ricorrendo invece a un normale metodo (col vantaggio
che puo` essere virtuale, ecc) e al concetto di delegazione.
class classe {
    ...
public:
    ostream& emit(ostream&) const;
};
inline ostream&
operator<<(ostream& o, const classe& c)
{
    return c.emit(o);
}
Niente friend, niente problemi, virtualizzabile se occorre,
non fa ingrassare...:-).
Alex

Alex Martelli wrote:

Grazie per la risposta.
E' chiaro che cosi' non ci sono errori, ma se definisco la classe con
variabili private, non riesco ad accedervi attraverso l'operatore <<, perchè
il compilatore ritiene che questo non ha i privilegi per farlo, nonostante
sia stato dichiarato friend.
ostream& operator<<(ostream& o, const classe& c){
    o<<c.varClasse;
    return o;
}
E' poco che uso il visual C++, prima usavo il vecchio Borland 3.1, senza le
librerie standard e questo era codice di prassi.
Il tuo è un buon consiglio. Anche Lippman nella sua Homepage
http://people.we.mediaone.net/stanlipp/index.html
ha inserito del codice per visual C++ con l'operatore << implementato come
hai fatto tu.
Saluti
Luca

alla parte privata della classe.
Che compilatore usi? Il tuo codice non contiene errori di sorta.
Paolo
--------------------------------------------------
  Paolo Marotta
  Computer Science, University of Pisa
  home:   
http://www.cli.di.unipi.it/~marotta
--------------------------------------------------

}
domanda... l'operazione "o << c.varClasse" e` definita?
Non e` che il compilatore ti bacchetta su una di queste?
In questo caso, qual'e` il tipo di c.VarClasse?


 --------------------------------------------------
Visual c++ 6.0
Mi sta mettendo in difficoltà, perchè non capisco se il conflitto è nel
namespace o cosa altro.
Ho appena iniziato ad usare la libreria standard
Grazie e ciao
Luca

 output, in modo da potere accedere alla parte privata di questa?
E' successo anche a me. E' un errore documentato. Vai a vedere sul sito
della Microsoft (mi sembra che sia stato corretto con il SP2 o il SP3).
Ciao.