C ++中的二叉树使用引用

时间:2010-10-01 22:13:30

标签: c++ reference tree binary-tree

我希望使用引用而不是使用指针来实现二叉树(这通常是您在每本书和互联网上的每个网站中都会找到的)。我尝试了以下代码:

class tree_node {
private:
    tree_node& left;
    tree_node& right;
    data_type data;
public:
    void set_left(tree_node&);
    // ... other functions here
};

void tree_node::set_left(tree_node& new_left) {
    this.left = new_left;
}

我收到以下错误: 错误C2582:'tree_node'中的'operator ='函数不可用。

我知道我可以使用指针轻松实现它,但我想保持我的解决方案优雅而没有指针。你能告诉我哪里出错了吗?

5 个答案:

答案 0 :(得分:4)

您无法更改引用引用 1 的对象;初始化引用后,它始终引用初始化它的对象。

你应该使用指针。使用指针对此没有任何问题(使用指针也是如此,因为父节点拥有自己的子节点,因此清理和破坏很容易!)

(1)好吧,你可以显式调用对象的析构函数,然后在赋值运算符实现中使用placement new,但这只是一团糟!

答案 1 :(得分:2)

您无法分配参考。你想要做的事情是无法完成的......没有大量的弯曲......(每次你想要修改它时,你基本上会破坏一个节点并创建一个新节点。)

所有其他人都使用指针是有充分理由的。

答案 2 :(得分:2)

引用不仅仅是语法较短的指针。它们是他们引用的实际对象的另一个名称,即使用作作业的lhs。

int i = 3;
int j = 4;
int &ref = i;
ref = j;
std::cout << i << "\n"; // prints 4: i itself has been modified, 
                        // because semantically ref *is* i

也就是说,ref = ji = j具有相同的效果,或与*ptr = j具有相同的效果,如果您第一次完成int *ptr = &i;。这意味着,“将对象的内容j复制到ref引用的任何对象中。”

对于ref的完整生命周期,它始终会引用i。它不能被引用任何其他int,也就是说它不能“重新定位”。

参考数据成员也是如此,只是它们的生命周期与自动变量不同。

因此,当您编写this.left = new_left时,意味着是什么,“将对象new_left的内容复制到任何对象this.left中”。哪个(a)不是你的意思,因为你希望重新座位this.left,而(b)即使它是你的意思,也是不可能的,因为this.left有参考成员哪个他们自己无法重新安置。

这是(b)导致你看到的编译器错误,尽管(a)是你应该使用指针的原因。

答案 3 :(得分:1)

C ++中的引用与其他语言中的引用不同。一旦设置了参考,在施工时,它就不能改为其他任何东西。

答案 4 :(得分:1)

我的建议是使用boost的shared_ptr类而不是引用。这将使您无需管理指针的释放。您可能也对Boost's graph library感兴趣。