previous next Up Title Contents Index

18.2 operator<< ja operator>>

Aikaisemmin mainittiin että eräs tietovirtojen merkittävimmistä eduista printf- tyyliseen tulostukseen on se, että tietovirtoihin voi tulostaa myös itse tehtyjä olioita. printf:hän ei ole mahdollista enää itse muuttaa ja lisätä uusia %- formaatteja.

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");
Tätä tietoa hyödyntäen voimme kirjoittaa operaattorista version, jonka ansiosta tulostus
	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_rivi
tapaa.


previous next Up Title Contents Index