2010-06-20 2 views
2

Я пишу дерево выражений.Ошибка Msg: невозможно преобразовать параметр 1 из 'Node *' в 'Node'

Класс Node имеет экземпляры как элементы слева, справа и родительские.

Благодаря James McNellis в this post, я объявил их как указатели.

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

Теперь я пытаюсь пересечь дерево и распечатать его (в файл «из»).

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

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

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

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

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

Как передать «левый» и «правый» метод «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

Я думаю, вы должны называть 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; 
}; 

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

+0

Шкалы упавшую с моих глаз! Конечно. Я сохраняю поведение с данными. В четвертой строке с конца я удалил n. от n.cargo, и я добавил еще один «out << << << n.cargo <<" \ n ";" перед первым возвратом, чтобы отображались листовые узлы. Он работает за исключением того, что возвращает 8224 перед каждым грузом, как это 82241,0 8224 * 82249,0 8224- 82241,0 .... Я звоню его без заданы параметры: root.traverse_tree(); Спасибо за урок! –

+0

8224 проблема решена.Одиночные кавычки заменены на двойные кавычки в «out <<» «<< cargo <<" \ n ";" –

+0

@Peter, проблема 8224 состоит в том, что '' '' является многобайтовой константой символа, которая превращается в целое число. Два пробела (каждый шестнадцатеричный 20 или десятичный 32) дают вам константу 32 * 256 + 32 = 8192 + 32 = 8224. – paxdiablo

3

разыменовывают ваши указатели:

traverse_tree(*right); 

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

void traverse_tree(Node &n) 
+0

Это работает. Спасибо, я подожду, прежде чем принять ответ. –

+0

Если я де-ссылку указатель, почему метод ожидать ссылку? –

+0

хотя, очевидно, это так, так как это решило проблему. благодаря –

Смежные вопросы