Prev Next Up Title Contents Index

Säiliöluokan vaihtaminen

Jos säiliöluokka on määritelty omaksi tyypikseen, ei yleensä tarvitse kajota itse ohjelmaan lainkaan, vaikka myöhemmin tarvitsee vaihtaa säiliöluokan fyysistä rakennetta.

Seuraavassa on tarkoituksena tallettaa kirjaimia. Talletustavoiksi on valittu järjestetty taulukko toteutettuna vektorina ja pino toteutettuna listana. Koska nämä tavat ovat täysin keskenään erilaisia, on samaistus suoritettu muutaman makron avulla.

Esimerkiksi vektorin alustus tarvitsee parametrikseen vektorin maksimikoon ja restart -metodi läpikäytävien alkioiden lukumäärän. Pinossa kumpikin ominaisuus on tarpeeton ja ne on määritelty #define:n avulla tyhjiksi. Lisäksi lisäysfunktion nimi on erilainen pinossa ja taulukossa. Lyhenne ADT kuvaa termiä Abstract Data Type.

cpp\luokat\listcl24.cpp - esimerkki container-luokasta ja iteraattorin käytöstä

	/* LISTCL24.CPP */
	// Esimerkki Container-luokan ja iteraattorin käytöstä, BC 4.52
	#include <iostream.h>
	
	#if 0
	#include <classlib\bags.h>
	typedef TBagAsVector<char>         ADTchar;
	typedef TBagAsVectorIterator<char> ITchar;
	#define SIZE (2)
	#endif
	
	#if 1
	#include <classlib\sets.h>
	typedef TSetAsVector<char>         ADTchar;
	typedef TSetAsVectorIterator<char> ITchar;
	#define SIZE (2)
	#endif
	
	#if 0
	#include <classlib\arrays.h>
	typedef TSArrayAsVector<char>         ADTchar;
	typedef TSArrayAsVectorIterator<char> ITchar;
	#define SIZE (5)
	#endif
	
	#if 0
	#include <classlib\stacks.h>
	typedef TStackAsList<char>         ADTchar;
	typedef TStackAsListIterator<char> ITchar;
	#define Add Push
	#define SIZE
	#endif
	
	
	void tulosta(char &c,void *)
	{
	  cout << c << " ";
	}
	
	#define VIIVA "------------------------------------------------------------\n"
	/****************************************************************************/
	int main(void)
	{
	  cout << VIIVA;
	
	  ADTchar lc SIZE;
	
	  lc.Add('a'); lc.Add('i'); lc.Add('e');
	  lc.Add('d'); lc.Add('d'); lc.Add('d');  lc.Add('d');
	
	  ITchar  lci(lc);
	  for (lci.Restart(); lci != 0; lci++)
	    cout << lci.Current() << " ";
	
	  cout << "|\n" << VIIVA;
	
	  lc.ForEach(tulosta,NULL);
	
	  cout << "|\n" << VIIVA;
	
	  return 0;
	}
Edellä tietorakenteen läpikäynti (= kaikkien alkioiden tulostus) on suoritettu kahdella eri tavalla. Iteraattorin avulla ja talletusluokan forEach -metodin avulla. forEach -metodi tarvitsee parametrikseen funktion osoitteen, jota sitten kutsutaan jokaisella tietorakenteeseen talletetulla alkiolla. Funktiolle voidaan välittää olion lisäksi parametrina yksi osoite, jonka avulla voidaan suorittaa tarvittavia laajempia parametrinvälitystehtäviä jos globaaleja muuttujia halutaan välttää (niinkuin pitäisi).


Prev Next Up Title Contents Index