[英]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 = j
與i = 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.