Vous avez une question sur ce qui serait la meilleure façon de mettre en œuvre itérateurs dans les domaines suivants:C++ itérateurs et l'héritage
Dire que j'ai une classe de base basé sur un modèle « Liste » et deux sous-classes « ListImpl1 » et « ListImpl2 ». L'exigence de base de la classe de base est de itérables être-à-dire que je peux faire:
for(List<T>::iterator it = list->begin(); it != list->end(); it++){
...
}
Je veux aussi permettre par exemple d'addition iterator:
for(List<T>::iterator it = list->begin()+5; it != list->end(); it++){
...
}
Le problème est que la mise en œuvre du iterator pour ListImpl1 sera différent de celui de ListImpl2. J'ai contourné ceci en utilisant un wrapper ListIterator contenant un pointeur sur un ListIteratorImpl avec des sous-classes ListIteratorImpl2 et ListIteratorImpl2, mais tout cela devient assez compliqué, particulièrement quand vous devez implémenter operator + dans ListIterator.
Avez-vous des idées sur une meilleure conception pour contourner ces problèmes?
Pourquoi ne pas utiliser ['std :: advance'] (http://www.cplusplus.com/reference/std/iterator/advance/)? – kennytm
Merci, mais disons que j'ai besoin de fournir un opérateur + plus efficace que de simplement utiliser l'opérateur ++ à plusieurs reprises. Vraisemblablement, j'ai toujours le même problème? – user360366
La distinction entre un itérateur avant (ce que 'std :: avance()' est pour) et un itérateur d'accès aléatoire est qu'un itérateur avant n'a pas une implémentation 'opérateur +' efficace (liste liée). Cette question implique un itérateur qui est un accès statiquement aléatoire, mais qui a un comportement dynamique pour cet accès. –