@frilix
Иногда "творю"

Передача узла дерева?

Доброго времени суток, столкнулся с проблемой передачи узлов дерева в функции. Задача проста, мне надо передавать узлы в функцию, а сама функция будет работать с этим узлом дальше. Но возникает ошибка при компиляции:
196|error: request for member ‘next’ in ‘* root’, which is of pointer type ‘Node*’ (maybe you meant to use ‘->’ ?)|

// Код узла дерева
class Node
{
    public:
        Token * value;       // Данные
        vector<Node *> next; // Список указателй на другие узлы

        // Деструктор
        ~Node()
        {
            delete value;

            int it = 0;
            for(; it < next.size(); it++)
                if(next[it] != nullptr)
                    delete next[it];
        }

        Node()
        {
            value = new Token();
        }

        void reverse(vector<Token *> &res)
        {
            int it = 0;
            for(; it < next.size(); it++)
                if(next[it] != NULL)
                    next[it]->reverse(res);

            res.push_back(value);
        }

        void Log()
        {
            cout << value->value << " ";
            int it = 0;
            for(; it < next.size(); it++)
                if(next[it] != NULL)
                    next[it]->Log();
        }
}

// Передача узла и вызов
bool Syntax::On_BG(Node ** root)
{
    if(++it >= lexList.size()) return false;
    if(lexList[it]->type != BEGIN) return false;

    Node * node;

    if(!On_BF(&node)) return false;
    *root->next.push_back(node);

    if(++it >= lexList.size()) return false;
    if(lexList[it]->type != END) return false;

    return true;
}


Немножко пояснения: On_BF(&node) функция, если все удачно проходит присваивает адрес сгенерированного узла указателю, потом я питаюсь этот адрес запихать в родительский узел, но возникает ошибка.
  • Вопрос задан
  • 131 просмотр
Решения вопроса 2
@res2001
Developer, ex-admin
У операции разыменования приоритет ниже, чем у операции выбора элемента по указателю, т.е. в вызове *root->next.push_back(node); порядок операций такой *(root->)next.push_back(node);, что, видимо, не то что вы хотели, расставьте скобки так: (*root)->next.push_back(node); и будет счастье.
А вообще, какой смысл в On_BG передавать указатель на указатель? Судя по коду достаточно просто указателя, а еще лучше - ссылки.
Ответ написан
Комментировать
@Mercury13
Программист на «си с крестами» и не только
По сути. Вы забыли порядок исполнения операций.
(*root)->next.push_back(node);

Чем ещё можно улучшить код…
Зачем вам указатель на указатель? Как массив указателей? Как «либо ссылка на указатель, либо ничего»? По видимому, ни то, ни другое, указатель, по сути передаётся по значению — так что стоило бы функцию переделать как…
bool Syntax::On_BG(Node * root)
или даже
bool Syntax::On_BG(Node & root)

PS. И да, указатель передаётся по значению, но то, на что он указывает, не исчезнет с выходом из функции.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы