J'essaie d'apprendre le C ++ alors pardonnez-moi si cette question démontre un manque de connaissances de base, vous voyez, le fait est que j'ai un manque de connaissances de base.
Je veux de l'aide pour savoir comment créer un itérateur pour une classe que j'ai créée.
J'ai une classe «Shape» qui contient un conteneur de points. J'ai une classe 'Piece' qui fait référence à une forme et définit une position pour la forme. La pièce n'a pas de forme, elle fait simplement référence à une forme.
Je veux que cela ressemble à Piece est un conteneur de points qui sont les mêmes que ceux de la forme qu'il référence mais avec le décalage de la position de la pièce ajouté.
Je veux pouvoir parcourir les points de la pièce comme si Piece était un conteneur lui-même. J'ai fait un peu de lecture et je n'ai rien trouvé qui m'ait aidé. Je serais très reconnaissant pour tous les conseils.
Réponses:
Vous devez utiliser Boost.Iterators. Il contient un certain nombre de modèles et de concepts pour implémenter de nouveaux itérateurs et adaptateurs pour les itérateurs existants. J'ai écrit un article sur ce sujet même ; c'est dans le magazine ACCU de décembre 2008. Il traite d'une solution élégante (IMO) pour exactement votre problème: exposer des collections de membres à partir d'un objet, en utilisant Boost.Iterators.
Si vous souhaitez utiliser uniquement le stl, le livre Josuttis contient un chapitre sur l'implémentation de vos propres itérateurs STL.
la source
/ EDIT: Je vois, un propre itérateur est en fait nécessaire ici (j'ai d'abord mal lu la question). Pourtant, je laisse le code ci-dessous reposer car il peut être utile dans des circonstances similaires.
Un itérateur propre est-il réellement nécessaire ici? Il suffit peut-être de transmettre toutes les définitions requises au conteneur contenant les points réels:
Cela suppose que vous utilisez un en
vector
interne, mais le type peut facilement être adapté.la source
auto begin() -> decltype(m_shape.container.begin()) { return m_shape.container.begin(); }
Ici, Concevoir une STL comme un conteneur personnalisé est un excellent article qui explique certains des concepts de base sur la façon dont une classe STL comme un conteneur peut être conçue avec la classe itérateur correspondante. Itérateur inversé (un peu plus difficile) reste cependant un exercice :-)
HTH,
la source
Vous pouvez lire cet article ddj
En gros, héritez de std :: iterator pour faire la plupart du travail à votre place.
la source
std::iterator
est marqué comme obsolète à partir de C ++ 17.L'écriture d'itérateurs personnalisés en C ++ peut être assez verbeuse et complexe à comprendre.
Comme je ne pouvais pas trouver un moyen minimal d'écrire un itérateur personnalisé, j'ai écrit cet en-tête de modèle qui pourrait aider. Par exemple, pour rendre la
Piece
classe itérable:Ensuite, vous pourrez l'utiliser comme un conteneur STL normal:
Il permet également d'ajouter d'autres types d'itérateurs comme
const_iterator
oureverse_const_iterator
.J'espère que cela aide.
la source
La solution à votre problème n'est pas la création de vos propres itérateurs, mais l'utilisation de conteneurs et d'itérateurs STL existants. Stockez les points de chaque forme dans un conteneur comme un vecteur.
Ce que vous faites à partir de là dépend de votre conception. La meilleure approche consiste à parcourir les points dans les méthodes à l'intérieur de Shape.
Si vous avez besoin d'accéder à des points en dehors de Shape (cela pourrait être une marque d'une conception déficiente), vous pouvez créer des méthodes Shape qui renverront les fonctions d'accès à l'itérateur pour les points (dans ce cas, créez également un typedef public pour le conteneur de points). Regardez la réponse de Konrad Rudolph pour plus de détails sur cette approche.
la source