Ystäväfunktioita käytetään, kun metodin pitää päästä käsiksi yhden tai useamman luokan alkioihin.
/* FRIEND.CPP */
/* Esimerkissä tehdään funktiot, jotka kertovat mahtuuko
ympyrä neliöön ja päinvastoin. Jottei tehtävästä tulisi
liian matemaattista, tutkitaan vain olioden kokoja.
Oikeasti mielekkäämpi tehtävä tutkia leikkaavatko
oliot toisiaan ja tällöin tarvittaisiin tietysti
myös keskipisteitä
*/
#include <stdio.h>
#include <math.h>
class cNelio; // Eteenpäin viittaus jotta void. käyt. ympyrässä
class cYmpyra{
double r; // Säde
public:
cYmpyra(double d=1.0) { r = d; }
friend mahtuuko(const cYmpyra &y, const cNelio &n);
friend mahtuuko(const cNelio &n, const cYmpyra &y);
friend mahtuuko(const cYmpyra &y1, const cYmpyra &y2);
};
class cNelio{
double s; // Sivun pituus
public:
cNelio(double d=1.0) { s = d; }
friend mahtuuko(const cYmpyra &y, const cNelio &n);
friend mahtuuko(const cNelio &n, const cYmpyra &y);
friend mahtuuko(const cNelio &n1, const cNelio &n2);
};
int mahtuuko(const cYmpyra &y, const cNelio &n)
{
return ( 2*y.r < n.s );
}
int mahtuuko(const cNelio &n, const cYmpyra &y)
{
return ( sqrt(2.0)*n.s/2 < y.r );
}
int mahtuuko(const cYmpyra &y1, const cYmpyra &y2)
{
return ( y1.r < y2.r );
}
int mahtuuko(const cNelio &n1,const cNelio &n2)
{
return ( n1.s < n2.s );
}
int main(void)
{
cNelio n1(2.1),n2(2.5); cYmpyra y1(0.9),y2(1.2);
if ( mahtuuko(n1,y1) ) printf("Neliö 1 mahtuu ympyrän 1 sisälle.\n");
if ( mahtuuko(y1,n1) ) printf("Ympyrä 1 mahtuu neliön 1 sisälle.\n");
if ( mahtuuko(y1,y2) ) printf("Ympyrät mahtuvat sisäkkäin.\n");
if ( mahtuuko(n1,n2) ) printf("Neliöt mahtuvat sisäkkäin.\n");
return 0;
}
Edellä olisi tietysti voitu määritellä esimerkiksi
neliölle ystäväfunktio, joka on ympyrän jäsenfunktio
(metodi) ja sillä olisi parametrina vain neliö tai ympyrä ja
toinen parametri otettaisiin sitten ympyrästä this
-parametrilla. Eli funktio voi olla yhden luokan jäsenfunktio ja toisen
luokan ystäväfunktio.