Ylös Edellinen Seuraava Otsikkosivu Hakemisto Sisällys

18.6 Ystäväfunktiot

Usein kirjallisuudessa mm. tulostus opetetaan tekemään seuraavasti:

	class cTuote {
	...
	 friend ostream &operator<<(ostream &os,const cTuote &tuote);
	}
	
	ostream &operator<<(ostream &os,const cTuote &tuote) { 
	  ... viitataan suoraan luokan suojattuihin attribuutteihin
	}

Funktion tai luokan esitteleminen ystäväksi tarkoittaa sitä, että funktio tai luokka pääsee suoraan käsiksi olion attribuutteihin. Tämä ei yleensä kuitenkaan ole kovin suotavaa. Jopa itse kielen tekijäkin on myöntänyt että ystäväfunktiot ( friend) ovat tarpeettomia. Mehän vältimme ystäväfunktion seuraavalla tekniikalla:

	class cTuote {
	...
	  ostream &tulosta(ostream &os) const { ... }
	}
	
	ostream &operator<<(ostream &os,const cTuote &tuote) { 
	  return tuote.tulosta(os);
	}

emmekä joutuneet edes kirjoittamaan yhtään enempää koodia. Toinen tapa välttää ystäväfunktioita on saantimetodien käyttäminen:

	class cRajoitettu {
	...
	  int Arvo() const { return arvo; }
	};
	
	ostream &operator<<(ostream &os, const cRajoitettu &r) {return os << r.Arvo(); }

Tässäkään tapauksessa ei ole kenellekään luovutettu pääsyä muuttamaan suojattuja attribuutteja.

Vastaavasti ystävyyttä esitetään kirjallisuudessa muidenkin operaattoreiden kuormittamisessa käytettäväksi, mutta tottakai voimme em. tekniikoilla välttää ystäväfunktioiden käytön.

Siis pyrimme jatkossa välttämään ystäväfunktioita (jopa enemmän kuin goto- lausetta).


Ylös Edellinen Seuraava Otsikkosivu Hakemisto Sisällys