Ссылка на указатель в функции-члене C ++ - PullRequest
2 голосов
/ 07 сентября 2010

Я пишу функцию-член, которая использует указатель на переменную-член в качестве итератора.Однако я хочу ссылаться на указатель внутри функции исключительно для удобства чтения.Вот так:

/* 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);
}

Это в основном то, к чему я иду, где this-> getNextIter - BTreeNode *.Однако я получаю ошибку:

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

Какой синтаксис подходит для такого рода вещей?

Приветствия,

Рис

1 Ответ

3 голосов
/ 07 сентября 2010

Ваша функция-член const -качественна, поэтому вы не можете изменить переменную-член getNextIter. Вам необходимо использовать константную ссылку:

BTreeNode * const & it = getNextIter;

Однако в вашей функции вы изменяете it, поэтому вместо этого вам, вероятно, нужно удалить const -квалификацию из функции-члена или сделать getNextIter переменную-член mutable.

Если у вас есть функция-член, которая const -качественна, все не mutable переменные-члены * const -квалифицированы внутри функции-члена, поэтому компилятор сообщает, что при попытке использовать getNextIter внутри getNext() он имеет тип DataTypes::BTreeNode* const (обратите внимание на const).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...