Pakiet programów do zdalnego nauczania Programowania Orientowanego Obiektowo
Dzisiaj jest
Poniedziałek, 16 Lipiec 2018
Zarejestrowanych użytkowników: 4
Dostępnych pytań testowych: 102
HOME
Strona tytułowa pracy dyplomowej
NAUKA
Materiały dydaktyczne związane z OOP
TESTY
Sprawdzenie poziomu zdobytej wiedzy
ZASOBY
Literatura i zasoby sieciowe o OOP
ŹRÓDŁA
Zbiór projektów dydaktycznych z OOP
KONTO
Możliwość śledzenia własnych postępów
INFO



Iteratory zewnętrzne i wewnętrzne

Dotychczas przedstawiony w przykładach były tylko iteratory zewnętrzne. W ich przypadku sterowanie procesem iteracyjnym odbywa się przez klienta – to on wywołuje metody przejścia do następnego elementu, pobrania elementu i operacje wykonywane na elementach.

Istnieje także inne podejście iteracji – iteratory wewnętrzne. W takim wypadku klient dostarcza tylko implementację operacji (poprzez obiekt funkcyjny bądź wskaźnika), która ma być dokonywana na elementach kontenera. Proces iteracji odbywa się wewnątrz, w niewidoczny dla użytkownika sposób.

Przykładowa deklaracja metody iteracji wewnętrznej jest bardzo prosta:

void dlaKazdego (FunkcjaIteratora & funIt) const;

Przyjmuje ona parametr referencyjny do klasy typu FunkcjaIteratora. Klasa ta definiuje wspólny interfejs dla klas operacji przesyłanych do iteratora wewnętrznego.

class FunkcjaIteratora {
public:
	virtual void operacja (int x, double y) = 0;
};

Definicja metody dlaKazdego() to w rzeczywistości kod analogiczny do sekwencyjnego przechodzenia kontenera za pomocą iteratorów zewnętrznych. Wywnętrz pętli wywoływana jest metoda operacja() klasy FunkcjaIteratora. Dzięki temu, że można dziedziczyć z tej klasy i tworzyć nowe implementacje operacji iterator wewnętrzny jest konfigurowalny.

void ModelDanych::dlaKazdego (FunkcjaIteratora & funIt) const {
	ModelDanych::Iterator it = iterator();
	while (!it.czyKoniec()) {
		funIt.operacja(it.x(), it.y());
		it.nastepny();
	}
}

Przykładowa klasa pochodna służąca do wypisywania elementów:

class Wypisz : public FunkcjaIteratora {
	virtual void operacja (int x, double y) {
		std::clog << x << " " << y << std::endl;
	}
};
Adamik Łukasz, Politechnika Śląska w Gliwicach (AEiI) - 2010/11