2010-06-20 64 views
2

我在写一个表达式树。错误消息:无法将参数1从“节点*”转换为“节点”

节点类具有自己的实例作为成员左,右和父。

感谢James McNellisthis 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) 
    }; 

现在我尝试遍历树并将其打印出来(将文件“out”)。

递归调用'traverse_tree(left);'和'traverse_tree(右)';'

导致错误消息“无法将参数1从'节点*'转换为'节点'”。

Traverse_tree最初是以根节点作为参数调用的。

我觉得参数的声明“(节点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

我想你应该调用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 .... 我没有arguements调用它:root.traverse_tree();感谢您的教训! – 2010-06-20 18:57:58

+0

8224问题解决了。“out <<”“<< cargo <<”\ n“;”“单引号改为双引号;”“ – 2010-06-20 20:59:14

+0

@Peter,8224问题是因为''''是一个多字节字符常量,它变成了一个整数。两个空格(每个十六进制20或十进制32)给你常量32 * 256 + 32 = 8192 + 32 = 8224. – paxdiablo 2010-06-21 08:42:45

3

取消引用您的指针:

traverse_tree(*right); 

您可能还需要改变你的traverse_tree方法接受一个参考:

void traverse_tree(Node &n) 
+0

这是有效的。谢谢,我会等一会儿再接受答案。 – 2010-06-20 14:48:46

+0

如果我去引用指针,为什么该方法需要引用? – 2010-06-20 19:28:56

+0

虽然,显然它确实,因为这解决了问题。谢谢 – 2010-06-21 11:10:49

相关问题