Referenzierung einen Zeiger in einem C ++ Elementfunktion
-
01-10-2019 - |
Frage
Ich schreibe eine Member-Funktion, die einen Membervariable Zeiger als Iterator verwendet. Allerdings mag ich den Zeiger innerhalb der Funktion lediglich zum besseren Lesbarkeit willen verweisen. Wie so:
/* 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);
}
Dies ist im Grunde, was ich werde, wo this-> getNextIter ist ein BTreeNode *. Ich bekomme aber den Fehler:
btree.cpp:238: error: invalid initialization of reference of type
'DataTypes::BTreeNode*&' from expression of type 'DataTypes::BTreeNode* const'
Was ist die angemessene Syntax für diese Art der Sache?
Cheers,
Rhys
Lösung
Ihre Member-Funktion ist const
qualifiziert, so dass Sie nicht die Membervariable getNextIter
ändern können. Sie benötigen eine const-Referenz verwenden:
BTreeNode * const & it = getNextIter;
Doch in Ihrer Funktion, ändern Sie it
, so stattdessen wahrscheinlich müssen Sie die const
-Qualifikation aus der Elementfunktion entfernen oder die getNextIter
Membervariable mutable
machen.
Wenn Sie eine Member-Funktion haben, die const
qualifiziert ist, werden alle nicht-mutable
Membervariablen sind const
qualifizierte innerhalb der Member-Funktion, also warum die Compiler-Berichte, dass, wenn Sie versuchen, getNextIter
innerhalb von getNext()
zu verwenden, ist es eine hat Typ von DataTypes::BTreeNode* const
(man beachte die const
).