Référençant un pointeur dans une fonction C ++ membre
-
01-10-2019 - |
Question
J'écris une fonction membre qui utilise un pointeur variable membre comme iterator. Cependant, je veux référencer le pointeur dans la fonction uniquement pour des raisons de lisibilité. Comme ceci:
/* 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);
}
Ceci est essentiellement ce que je vais faire, où this-> getNextIter est un * BTreeNode. Cependant, je reçois 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
La solution
Votre fonction membre est const
qualifié, de sorte que vous ne pouvez pas modifier la getNextIter
variable membre. 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 de faire la getNextIter
variable membre de mutable
.
Lorsque vous avez une fonction membre qui est const
qualifié, toutes les variables non membres de mutable
sont à l'intérieur de const
qualifié de la fonction de membre, d'où la raison pour laquelle les rapports du compilateur que lorsque vous essayez d'utiliser getNextIter
l'intérieur de getNext()
, il a de type de DataTypes::BTreeNode* const
(notez le const
).