Obecnie próbuję zrozumieć istotę iteratorów w różnych językach, tj. Sposób ich implementacji.Pisanie własnej implementacji podobnego do Iteratora w C++
Na przykład istnieje poniższa klasa, która eksponuje interfejs listy.
template<class T>
class List
{
public:
virtual void Insert(int beforeIndex, const T item) throw(ListException) =0 ;
virtual void Append(const T item) =0;
virtual T Get(int position) const throw(ListException) =0;
virtual int GetLength() const =0;
virtual void Remove(int position) throw(ListException) =0;
virtual ~List() =0 {};
};
Według GoF, najlepszym sposobem wdrożenia iterator, który może obsługiwać różne rodzaje przechodzenie jest utworzenie klasy bazowej Iterator (przyjaciel) z listy chronionych metod, które mogą uzyskać dostęp do członków listy jest. Konkretne implementacje Iteratora obsłużą zadanie na różne sposoby i uzyskają dostęp do prywatnych i chronionych danych List za pośrednictwem interfejsu podstawowego.
Stąd rzeczy stają się coraz bardziej zagmatwane. Powiedzmy, mam klasy LinkedList i ArrayList, obie pochodzą z List, a tam są też odpowiednie iteratory, każda z klas zwraca. Jak mogę wdrożyć LinkedListIterator? Nie mam pomysłów. I jakie dane może pobrać klasa iteratora z listy (która jest zwykłym interfejsem, podczas gdy implementacje wszystkich klas pochodnych różnią się znacząco)?
Biblioteka "Iter Iterator" jest dobrym źródłem informacji i opracowywania nowych typów/cech iteratora http://www.boost.org/doc/libs/1_42_0/libs/iterator/doc/index.html – Hippicoder
To pachnie jak kod Java/C#. Często dobre C++ nie wygląda jak Java czy C#. –
Dlaczego chcesz czerpać z 'List', jeśli jest szablonem? Jeśli usuniesz wszystkie kwalifikatory 'wirtualne' i podasz brakujące definicje, możesz już z nich korzystać w dowolnym celu. – wilhelmtell