Nach another question about iterators habe ich einige Zweifel über benutzerdefinierte Container. In meinem Container ist iterator
eine Unterklasse von const_iterator
, so dass ich die Konvertierung von "non-const" zu const "for free" bekomme. Aber ist das erlaubt oder gibt es irgendwelche Nachteile oder nicht-Arbeitsszenarien für solch ein Setup?Kann 'Iterator' nur die Unterklasse 'const_iterator' eingeben?
Antwort
Ja, das ist in Ordnung. So ist die VC10-Implementierung der Iteratoren für vector
strukturiert. Siehe _Vector_iterator
und _Vector_const_iterator
in <vector>
.
Übrigens ist es schwierig, Iteratoren zu schreiben. Es lohnt sich, die boost :: iterator-Bibliothek zu lernen und zu verwenden.
Denken Sie über einen Fall nach, bei dem Sie die Iteratormitglieder ändern müssen.
Und? Ich denke, du musst es ausarbeiten. – doublep
Subclassing scheint mir hier seltsam, aber es gibt tatsächlich ein Problem.
Auch wenn Sie nicht auf Boost-Teile angewiesen sein möchten, überprüfen Sie die Boost.Iterator-Bibliothek und insbesondere die iterator_facade
und iterator_adaptor
Bits.
Es gibt ein vollständiges Beispiel, wie man einen iterator
und einen const_iterator
für Ihre Klasse schreibt, ohne zu viel zu kopieren. Ihre Idee ist es, eine Vorlage iterator_base
Klasse zu schreiben, die Sie dann für const und nicht-const-Typen in der Zeile verwenden:
template <class Value> class iterator_base;
typedef iterator_base<T> iterator;
typedef iterator_base<const T> const_iterator;
Das Problem mit Subclassing ist, dass man dann einen virtuellen Destruktor bereitstellen sollte und du bist ausgesetzt zu schneiden (beim Aufbau eines const_iterator
von einem iterator
)
Also, im Gegensatz zu anderen hier, ich finde es nicht "gut".
"Sie sollten dann einen virtuellen Destruktor bereitstellen" - aber meine Destruktoren tun sowieso nichts. Selbst wenn sie dies tun würden, würde der Typ "iterator" wahrscheinlich nur den "const_iterator" -Destruktor erben, ohne etwas extra zu tun. "Sie sind dem Schneiden ausgesetzt" - können Sie bitte näher ausführen, ich verstehe nicht, was Sie hier meinen. – doublep
Ein Beispiel für das Slicen, 'iterator it; const_iterator cit = statischer_cast
Ich weiß, aber in meinem Fall ist es eine kleine Bibliothek und ich will nicht, dass es von irgendetwas abhängt, einschließlich Boost-Teile. – doublep
Es ist schon gut, dass manche Implementierung von STL so funktioniert. Kennen Sie zufällig eine Klausel im Standard, die Iteratoren und Anforderungen allgemein beschreibt? – doublep
24.2 des FCD (n3035.pdf) beschreibt Iteratoren und ihre Anforderungen –