previous next Up Title Contents Index

21.7 Tarkistus- funktio - osoitin

Joissakin tapauksissa tarkistus voitaisiin hoitaa myös siten, että jäseneltä kysytään minkälaisella funktiolla oikeellisuus tarkistetaan:
	/* Funktio- osoitin tarkistusfunktioon:                                      */
	typedef int (*Tarkistus_funktio)(Tarkistus_tyyppi *, string &);
	. . .
int cNaytto::kysy_tiedot(cJasen &jasen)
{ Tarkistus_funktio tark; . . . kaikille kentille do { . . . kysy kenttä => jono tark = jasen.Tarkistus(k); virhe = 0; if ( tark != NULL ) virhe = tark(jono); } while ( virhe ); . . . }

Edellä totesimme, että tarkista_hetu(kerho,jono) ei ehkä riitäkään. Miksi? Jos lisäämme uutta nimeä, niin asia on aivan oikein. Mutta entäpä mikäli korjaamme sotua ja kirjoitamme vastaukseksi täsmälleen saman tekstin kuin alkuperäinenkin. Eikö alkuperäinen hetu tällöin löydy? Löytyypä hyvinkin. Siis tarkista_hetu "hermostuu" ja tulostaa virheilmoituksen:

	Sotu esiintyy ennestään 
ja vaatii uutta syöttöä!

Siis parametrit eivät riitä! Mitä pitää lisätä? Tästä ajattelutavasta saattaa seurata loputon kasa uusia parametreja. Kasataan kaikki tarkistusten tarvitsemat parametrit yhteen ainoaan tietueeseen Tarkistus_tyyppi ja kutsutaan tarkistusfunktioita muodossa:

	t_sotu(tarkistus_tiedot,jono); 

Vastaavasti tietysti tarkistusfunktio-osoittimien kanssa

	typedef int (*Tarkistus_funktio)(Tarkistus_tyyppi &, string &);
	. . .
	int cNaytto::kysy_tiedot(cJasen &jasen)
	{
	  Tarkistus_funktio tark;
	  Tarkistus_tyyppi tiedot(...
	. . .
	    if ( tark != NULL ) virhe = tark(tiedot,jono);
	. . .



previous next Up Title Contents Index