Ylös Edellinen Seuraava Otsikkosivu Hakemisto Sisällys

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 parametrejä. 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);
	. . .


Ylös Edellinen Seuraava Otsikkosivu Hakemisto Sisällys