2010-09-07 9 views
2

J'écris une fonction membre qui utilise un pointeur de variable membre comme itérateur. Cependant, je veux référencer le pointeur dans la fonction uniquement pour des raisons de lisibilité. Comme si:Référencement d'un pointeur dans une fonction membre C++

/* getNext will return a pos object each time it is called for each node 
* in the tree. If all nodes have been returned it will return a Pos 
* object (-1, -1). 
* TODO: Add a lock boolean to tree structure and assert unlocked for 
*  push/pop. 
*/ 
Pos BTree::getNext() const 
{ 
    BTreeNode*& it = this->getNextIter; 

    while (it) 
    { 
     if (it->visited) 
     { 
      /* node has been visited already, visit an unvisited right 
      * child node, or move up the tree 
      */ 
      if ( it->child [BTREE_RIGHT] != NULL 
       && !it->child [BTREE_RIGHT]->visited) 
      { 
       it = it->child [BTREE_RIGHT]; 
      } 
      else 
      { 
       it = it->parent; 
      } 
     } 
     else 
     { 
      /* if unvisited nodes exist on the left branch, iterate 
      * to the smallest (leftmost) of them. 
      */ 
      if ( it->child [BTREE_LEFT] != NULL 
       && !it->child [BTREE_LEFT]->visited) 
      { 
       for (; 
        it->child [BTREE_LEFT] != NULL; 
        it = it->child [BTREE_LEFT]) {} 
      } 
      else 
      { 
       it->visited = 1; 
       return it->pos; 
      } 
     } 
    } 

    it = this->root; 
    this->setTreeNotVisited (this->root); 
    return Pos (-1, -1); 
} 

C'est fondamentalement ce que je vais pour, où this-> getNextIter est un BTreeNode *. Cependant, j'obtiens l'erreur:

btree.cpp:238: error: invalid initialization of reference of type 
'DataTypes::BTreeNode*&' from expression of type 'DataTypes::BTreeNode* const' 

Quelle est la syntaxe appropriée pour ce genre de chose?

Cheers,

Rhys

Répondre

3

Votre fonction membre est const aux qualifiés, de sorte que vous ne pouvez pas modifier la variable membre getNextIter. Vous devez utiliser une référence const:

BTreeNode * const & it = getNextIter; 

Cependant, dans votre fonction, vous modifiez it, donc au lieu que vous avez probablement besoin de retirer la const -Qualification de la fonction de membre ou faire la variable membre getNextItermutable.

Lorsque vous avez une fonction membre qui est const aux qualifiés, toutes les variables non membres mutable sont const qualifiés pour un intérieur de la fonction membre, donc pourquoi le compilateur signale que lorsque vous essayez d'utiliser getNextIter l'intérieur de getNext(), il a un type de DataTypes::BTreeNode* const (notez le const).

+0

Ah oui, bien sûr j'ai écarté l'évidence ... L'itérateur Mutable est la solution! Merci, monsieur! –

+0

@Fecal Brunch: Par curiosité, pourquoi ne pas utiliser l'interface standard de l'itérateur STL? –

+0

Je m'interrogeais sur la même chose, l'inconvénient le plus évident de la méthode est que 'getNextIter' est en train de muter la structure de données. Il est impossible de marcher deux fois en parallèle, par exemple. –

Questions connexes