簡體   English   中英

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

[英]Binary trees in C++ using references

我希望使用引用而不是使用指針來實現二叉樹(這通常是您在每本書和互聯網上的每個網站中都會找到的)。 我嘗試了以下代碼:

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:'operator_n'中的'operator ='函數不可用。

我知道我可以使用指針輕松實現它,但我想保持我的解決方案優雅而沒有指針。 你能告訴我哪里出錯了嗎?

您不能更改引用引用的對象1 ; 初始化引用后,它始終引用初始化它的對象。

你應該使用指針。 使用指針對此沒有任何問題(使用指針也是如此,因為父節點擁有自己的子節點,所以清理和破壞很容易!)

(1)好吧,您可以顯式調用對象的析構函數,然后在賦值運算符實現中使用placement new,但這只是一團糟!

您無法分配參考。 你想要做的事情是無法完成的......沒有大量的彎曲......(每次你想要修改它時,你基本上會破壞一個節點並創建一個新節點。)

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

引用不僅僅是語法較短的指針。 它們是他們引用的實際對象的另一個名稱,即使用作任務的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

也就是說,如果你第一次做int *ptr = &i; ,則ref = ji = j ref = 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)是你應該使用指針的原因。

C ++中的引用與其他語言中的引用不同。 一旦設置了引用,在構造時,它就不能更改為其他任何內容。

我的建議是使用boost的shared_ptr類而不是引用。 這將使您無需管理指針的釋放。 您可能也對Boost的圖庫感興趣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM