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

Était-ce utile?

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).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top