Prev Next Up Title Contents Index

Ystäväluokka


Ilmoittamalla luokka toisen luokan ystäväksi saadaan ehkä edellistä oliomaisempi ratkaisu:

friend2.cpp - ystäväluokka

	/* FRIEND2.CPP */
	
	/* Esimerkissä tehdään funktiot, jotka kertovat mahtuuko
	   ympyrä neliöön ja päinvastoin.
	   Toteutus ystäväluokan avulla.
	*/
	
	#include <iostream.h>
	#include <math.h>
	
	class cNelio; // Eteenpäin viittaus jotta void. käyt. ympyrässä
	
	class cYmpyra{
	  friend cNelio;
	  double r; // Säde
	public:
	  cYmpyra(double d=1.0) { r = d; }
	  int mahtuuko(const cNelio &n) const;
	  int mahtuuko(const cYmpyra &y2) const {
	    return ( r < y2.r );
	  }
	};
	
	class cNelio{
	  double s; // Sivun pituus
	  friend cYmpyra;
	public:
	  cNelio(double d=1.0) { s = d; }
	  int mahtuuko(const cYmpyra &y) const {
	    return ( sqrt(2.0)*s/2 < y.r );
	  }
	  int mahtuuko(const cNelio &n2) {
	    return ( s < n2.s );
	  }
	};
	
	int cYmpyra::mahtuuko(const cNelio &n) const
	{
	  return ( 2*r < n.s );
	}
	
	int main(void)
	{
	  cNelio n1(2.1),n2(2.5); cYmpyra y1(0.9),y2(1.2);
	  if ( n1.mahtuuko(y1) ) cout << "Neliö 1 mahtuu ympyrän 1 sisälle.\n";
	  if ( y1.mahtuuko(n1) ) cout << "Ympyrä 1 mahtuu neliön 1 sisälle.\n";
	  if ( y1.mahtuuko(y2) ) cout << "Ympyrät mahtuvat sisäkkäin.\n";
	  if ( n1.mahtuuko(n2) ) cout << "Neliöt mahtuvat sisäkkäin.\n";
	  return 0;
	}

Tehtävä 1.22 Inline ei aina onnistu

Miksi edellä ympyra::mahtuuko ei ole kirjoitettu inline- funktioksi niinkuin vastaava nelio::mahtuuko.

Tehtävä 1.23 Uuden ystävän lisääminen

Mitä tapahtuu, mikäli FRIEND.CPP:ssä pitäisi lisätä vaikkapa uusi luokka: kolmio?


Prev Next Up Title Contents Index