[débutant] iterateur

iterateur [débutant] - C++ - Programmation

Marsh Posté le 29-11-2009 à 17:10:12    

Hello,
 
Je débute en C++, après un lavage de cerveau avec Java... voici donc ma question :
 
En Java, on a un truc bien pratique qui est le Iterator<Maclasse>, et j'ai vu qu'en c++, on a aussi des "iterator".
Ce que je ne comprends pas, c'est comment les utiliser comme je veux.
 
Exemple : je veux un constructeur de classe A qui prend en paramètre tout plein d'objets de la classe B, en nombre indéfini.
Pour faire ça de façon jolie, j'aimerais proposer un constructeur avec en paramètre un itérateur sur des objets de la classe B (je ne veux pas savoir si l'utilisateur stocke ses objets dans un vector, list, deque, etc).
Seulement, j'ai bien l'impression que je ne peux pas, et que ça ne marche pas du tout comme ça...
 
Une idée ? Une solution de remplacement ?
 
Merci beaucoup !

Reply

Marsh Posté le 29-11-2009 à 17:10:12   

Reply

Marsh Posté le 30-11-2009 à 01:15:25    

Si tu veux que le type du conteneur dans ta classe A qui stocke les objets de la classe B reste masqué, tu ne pourras pas utiliser directement un itérateur comme ceux de la STL du c++ (à moins de bricoler avec la généricité mais si tu commences ca risque d'être compliqué).
 
Si tu veux le programmer toi-même tu as deux possbilités grosso-modo :
1. Tu as par exemple un integer dans ta classe A qui te permet de connaitre ton B "courant". Tu as une méthode d'initialisation qui met cette variable a 0 et une methode du genre "get" qui renvoie le prochain B et incrémente ton entier.
2. Tu peux aussi faire toi-même une classe itérateur. Tu peux par exemple créer une classe iterator_B qui fait la même chose que dans le premier cas mais de facon externe. Ce sera "plus propre" car l'itérateur sera un objet en soi, qui se gère tout seul et qui ne dépend plus de A.


Message édité par erikkarls le 30-11-2009 à 01:17:24
Reply

Marsh Posté le 08-12-2009 à 10:45:33    

Si je ne me trompe pas ton problème est surtout de ne pas être dépendant de la structure de l'utilisateur.
Dans ce cas là, il est possible d'encapsuler ton container et de n'utiliser que cette encapsulation :
 

Code :
  1. // Côté client
  2. class BContainer : public std::vector<A>{};
  3. // De ton côté
  4. class A{
  5. A(BContainer::iterator it){...}
  6. };


 
Normalement cela fonctionne.
De cette manière le client peut changer le type de container qd il veut de manière transparente.


Message édité par Lan Wezel le 08-12-2009 à 10:46:27
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed