Kuormitettaessa esimeriksi << - operaattoria, pitäisi oikeastaan muuttaa sitä tietovirta- luokkaa, johon ollaan tulostamassa.
cout << "Kissa\n"; // tarkoittaa periaateessa: cout.operator<<("Kissa\n");Onneksi operaattoreista on myös 2- operandiset versiot. Eli
operator<<(cout,"Kissa\n");
cout << tuotteet[i] << "\n";todella tulostaa tietorakenteen i:n tuotteen.
ostream &operator<<(ostream &os,const cTuote &tuote) { return tuote.tulosta(os); }Koska tuotteen tulostaminen on sinänsä jo valmis, pitää meidän vain kutsua tuotteen tulosta- metodia operaattorin määrittelyssä. Operaattorin PITÄÄ palauttaa vastaava tietovirta, jotta ketjutulostus:
cout << tuotteet[i] << "\n";olisi mahdollinen. Tässähän oli itse asiassa kyseessä kutsu
operator<<(operator<<(cout,tuotteet[i]),"\n");Itse tuote on esitelty vakioviitteeksi operaattorin << parametrilistassa. Viitteeksi, koska on turha siirrellä kokonaisia olioita ja vakioviitteeksi koska tulostuksen aikana tuotetta ei tietenkään muuteta!
Aivan vastaavasti esitellään >> - operaattori:
istream &operator>>(istream &is,cTuote &tuote) { tuote.lue(is); return is; }Ohjelman tuoterek.cpp lukusilmukka voisi tämän ansiosta olla jopa muodossa
cTuote tuote; while ( f >> tuote ) ynnaa(tuote);Toisaalta aikaisemmin todettiin että tässä on vaara sotkea rivien järjestys joten parempana voidaan pitää alunperin esitettyä
lue_rivi käsittele_rivitapaa.