Prev Next Up Title Contents Index

Ystäväfunktiot (friend functions)


Ystäväfunktioita käytetään, kun metodin pitää päästä käsiksi yhden tai useamman luokan alkioihin.

friend.cpp - ystäväfunktiot

	/* 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.

Tehtävä 1.21 Jäsenfunktio ja ystävä

Toteuta friend.cpp:stä versio, jossa kaikki mahtuuko- funktiot ovat jäsenfunktioita.


Prev Next Up Title Contents Index