Ylös Edellinen Seuraava Otsikkosivu Hakemisto Sisällys

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.


Ylös Edellinen Seuraava Otsikkosivu Hakemisto Sisällys