2017-10-14 8 views
0

Récemment, en classe, nous avons appris que l'itérateur STL devait traverser des listes. Dans l'exemple de code donné pour un Iterator de base pour une liste chaînée, je suis tombé sur quelque chose que je ne comprenais pas.Présentation de la classe d'itération en C++

Nous avons reçu 2 classes Iterator, const_iterator et itérateur. Ils étaient les deux sous-classes de la classe List. itérateur hérité de const_iterator. Dans le constructeur de l'itérateur je ne sais pas pourquoi il a été écrit comme ça;

classe iterator:

class iterator:public const_iterator{ 
    friend sortedList 
protected: 
    iterator(Node* n):const_iterator(n){} 
public: 
    iterator(){ 
     n = nullptr; 
    } 

La classe const_iterator:

class const_iterator { 
    friend SortedList 
protected: 
    Node* curr_; 
    const_iterator(Node* n){ 
     curr_ = n; 
    } 
public: 
    const_iterator(){ 
     curr_ = nullptr; 
    } 

Ma question est pourquoi iterator héritera de const_iterator et pourquoi le constructeur de iterator initialise la cteur de const_iterator et ne rien faire pour lui-même.

Question secondaire; en accédant à Curr_ de l'itérateur, comment je me référerais à cela? Est-ce que j'appellerais simplement curr_ ou est-ce que j'utiliserais ceci-> curr_?

+1

Ce n'est pas un code de bibliothèque standard. Pour le comprendre, nous aurions besoin de voir beaucoup plus de la mise en œuvre que vous demandez. –

+0

Quoi qu'il en soit, le ctor par défaut dans 'iterator' semble cassé. – Deduplicator

+1

Vous pouvez jeter un oeil à https://stackoverflow.com/questions/2844466/can-iterator-type-just-subclass-const-iterator qui peut vous aider à comprendre la logique entre hériter de const_iterator. Personnellement, je n'aime pas cette façon de procéder, car l'héritage public de l'OMI devrait être utilisé pour transmettre une information «publique» (c'est-à-dire un modèle pour des objets qui seront utilisés polymorphiquement), ce qui n'est pas le cas ici. –

Répondre

2

Ma question est de savoir pourquoi l'itérateur hérite de const_iterator et pourquoi le constructeur d'iterator initialise le ctor const_iterator et ne fait rien pour lui-même.

Les conteneurs standard doivent être convertis en iterator en const_iterator. Dériver l'un de l'autre est un moyen d'y parvenir.

Les magasins de classe de base const_iterator un pointeur vers un Node mais le iterator ne pas passer si le paramètre à la classe de base initialise le membre curr_ que les deux de base et dérivés peuvent utiliser.

lors de l'accès à Curr_ à partir de l'itérateur, comment je me référer à cela? Est-ce que j'appellerais simplement curr_ ou est-ce que j'utiliserais ceci-> curr_?

Vous pouvez utiliser curr_ à la fois dans la classe de base et dans la classe dérivée, à condition qu'il ne s'agisse pas d'une variable membre ou non. Le fait que le nom se termine par un trait de soulignement est une convention courante pour les noms de variables membres.

En cas de doute sur la portée, vous pouvez utiliser this->member pour indiquer que vous faites référence à un membre de la classe.

En utilisant this-> quand il est vraiment pas nécessaire est réputé supplémentaire confus par certaines personnes (comme moi) devrait donc probablement être sauvé pour les cas où il y a un réel besoin de désambiguïser un nom.