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
Ah oui, bien sûr j'ai écarté l'évidence ... L'itérateur Mutable est la solution! Merci, monsieur! –
@Fecal Brunch: Par curiosité, pourquoi ne pas utiliser l'interface standard de l'itérateur STL? –
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. –