fragen zu iteratoren in selbstprogrammierten containern
-
Hallo,
Ich bin gerade dabei mittels eines Templates eine Containerklasse zu schreiben. Zu diesem Thema habe ich folgende Seite im Internet gefunden:
http://www.oreillynet.com/pub/a/network/2005/11/21/what-is-iterator-in-c-plus-plus-part2.html?page=5Nun versteh ich da dran aber einige sachen nicht:
1. Wieso steht bei der Iteratorklasse dass dieser von der Klasse std::iterator<std::forward_iterator_tag, T> aberbt?? wieso macht man das?2. wie ist das was im Iterator bei der Operation "Iterator& operator++(int)" also Postinkrement abgeht??
3. wie ist die Zeile "return(&*(SQueue<T>::Iterator)*this);" in der Iteratorklasse in der Operation "T* operator->()" zu verstehen. kann vllt jemand klammern setzen dass man versteht was da wirklich passiert bzw wie das aufzulösen ist.
LG, Danke im Voraus
-
rabatz schrieb:
1. Wieso steht bei der Iteratorklasse dass dieser von der Klasse std::iterator<std::forward_iterator_tag, T> aberbt?? wieso macht man das?
wird unmittelbar davor erklärt. wenn auch die dritte möglichkeit, die typedefs direkt in der klasse zu deklarieren, ausgelassen wird.
2. wie ist das was im Iterator bei der Operation "Iterator& operator++(int)" also Postinkrement abgeht??
böse. vergiss Iterator& als Rückgabetyp und nimm einfach Iterator, also:
Iterator operator++(int)Typischer Fall von Referenzfetischismus in Verbindung mit Kopierphobie.
3. wie ist die Zeile "return(&*(SQueue<T>::Iterator)*this);" in der Iteratorklasse in der Operation "T* operator->()" zu verstehen. kann vllt jemand klammern setzen dass man versteht was da wirklich passiert bzw wie das aufzulösen ist.
Vergiss den cast, der ist überflüssig: da wir uns in einer Memberfunktion von Iterator befinden, ist der Ausdrucks *this ja bereits ein Lvalue vom Typ SQueue<T>::Iterator. Der Cast bewirkt nur, dass unser Iterator überflüssigerweise kopiert wird, bevor der * Operator auf die Kopie angewendet wird. Also besser
return &**this;oder auch
return &(this->operator*());Es geht darum, den Operator-> durch den Operator* zu implementieren, was grundsätzlich vernünftig ist.
Ach ja, in deiner eigenen Klasse solltest du auch noch auf const-correctness achten. Wenn du mal nicht weißt, wann eine Funktion konstant sein sollte, denk einfach daran, wie das bei einem Pointer wäre.
-
hallo,
danke erstmal für deine schnelle antwort. ein paar fragen sind mir allerdings noch offen geblieben:
zu 1. ich hab dir erklärung oben zu diesem punkt gesehen aber sie leider nicht verstanden. wär also nett wenn sie mir jemand so erklären könnte dass ich als c++ anfänger es auch verstehe.
zu 2. dass man das & einfach weglassen kann ist mir schon klar. vielmehr war meine frage was passiert. ich mein es wird der übergebene zeiger zwar erhöht aber es wird dann nicht der erhöhte zeiger sondern der der eingangs übergebene zeiger zurückgegeben. was hat das für einen sinn? was geht da vor?
LG
-
Zu 2: dasselbe was der Postinkrement immer macht:
int i=5; int j=++i; //j und i sind 6 j=++i; //i ist 7, j aber 6Kann man hie und da gebrauchen, z.B:
vector<int> vint; //irgendwas in den vector schreiben vector<int>::iterator vit=vint.begin(); while(vit!=vint.end()) cout<<*vit++; //bewirkt: cout<<*vit; vit=vit+1;Ja hier haette man es auch per for-Schleife machen koennen, darum geht's grad nicht.