Сообщение об ошибке: невозможно преобразовать параметр 1 из «Узла *» в «Узел» - PullRequest
3 голосов
/ 20 июня 2010

Я пишу дерево выражений.

Класс Node имеет свои экземпляры как члены left, right и parent.

Благодаря Джеймсу МакНеллису в этом посте , я объявил их указателями.

   class Node
   {
     public:
        char *cargo; 
        int depth; 
        Node *parent;
        Node *left; 
        Node *right;
    //constructors/destructor:
        Node(void); 
        Node(int a_depth, Node *pparent = __nullptr); 
        ~Node();
    //method:
        void traverse_tree(Node n)
    };

Теперь я пытаюсь пройтись по дереву и распечатать его (в файл "out").

Рекурсивный вызов 'traverse_tree (left);' и 'traverse_tree (справа);'

вызывает сообщение об ошибке «невозможно преобразовать параметр 1 из« Узла * »в« Узел »».

Traverse_tree первоначально вызывается с корневым узлом в качестве аргумента.

Я думаю, что объявление параметра "(Node n)" сбивает с толку компилятор и он не знает

вызывать ли конструктор или нет.

Как передать "left" и "right" методу "traverse_tree"?

void Node::traverse_tree(Node n)
    //utility to view the tree
{
    if (((left) ==  __nullptr)||((right) ==  __nullptr))
    {
        return;
    }
    traverse_tree(right);
    out<<'  '<<n.cargo<<"\n";
    traverse_tree(left);
    return;
};

Ответы [ 2 ]

3 голосов
/ 20 июня 2010

Разыщите ваши указатели:

traverse_tree(*right);

Возможно, вы также захотите изменить метод traverse_tree для принятия ссылки:

void traverse_tree(Node &n)
2 голосов
/ 20 июня 2010

Я думаю, вы должны вызывать traverse_tree с указателем узла, а не узла.Вы обычно используете указатели для такого рода операций.Это может привести к чему-то вроде:

void Node::traverse_tree (Node *n) {
    if ((left == __nullptr) || (right == __nullptr))
        return;
    traverse_tree (right);
    out << "  " << n.cargo << "\n";
    traverse_tree (left);
    return;
};

, и вы будете вызывать его с помощью:

root.traverse_tree (&root);

В какой-то момент вы можете захотеть реорганизовать свой код, чтобы сделать его более C ++ -например:

void Node::traverse_tree(void) {
    if ((left == __nullptr) || (right == __nullptr))
        return;
    right->traverse_tree();
    out << "  " << cargo << "\n";
    left->traverse_tree();
    return;
};

Другими словами, проходите, используя методы самих подузлов, а не передавая указатели (что на самом деле является не-объектно-ориентированным способом «старой школы»).

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