創建

2011-02-24 53 views
2

我有我的節點定義有點像雙鏈表節點的深層副本:創建

class LLNode 
{ 
public: 
    std::shared_ptr<LLNode> prev; 
    std::shared_ptr<LLNode> next; 
    std::shared_ptr<int> data; 
    LLNode(void) 
    : prev(std::shared_ptr<LLNode>(nullptr)), 
    next(std::shared_ptr<LLNode>(nullptr)), 
    data(std::shared_ptr<int>(nullptr)) 
    { 
    } 

    LLNode(const LLNode &node) 
    : prev(std::shared_ptr<LLNode>(node.prev == nullptr?nullptr:new LLNode(node.prev))), 
    next(std::shared_ptr<LLNode>(node.next == nullptr?nullptr:new LLNode(node.next))), 
    data(std::shared_ptr<int>(new int(node.data))) 
    { 
    } 
}; 

但是,如果我有一個鏈接到另一個節點(這顯然將通常的情況節點),複製節點A將實例化下一個節點B的副本,該節點又將嘗試實例化節點A的副本,該副本將嘗試複製節點B等等,直到出現棧溢出或內存錯誤。這可以通過僅實例化下一個(或前一個)的新副本來解決,但是之前(或下一個)鏈接到該節點的任何內容都不會被複制。

有複製雙向鏈表節點的好方法嗎?

+0

我很困惑,爲什麼你使用'shared_ptr',如果你要徹底顛覆它的整個目的。 – GManNickG 2011-02-24 20:31:26

+0

你的問題源於不加區別地使用shared_ptr,否則就會使用指針。僅當您希望指針的多個實例共享引用對象的所有權時才使用shared_ptr。 – 2011-02-24 20:35:37

+0

我希望能夠使用shared_ptr當只想引用下一個/ prev節點,但是當需要節點的深層副本時,它需要創建一個shared_ptr到一個新複製的對象,否則我會只有一個淺拷貝。答案在下面提供,雖然(使用外部複製方法) – helloworld922 2011-02-24 20:48:31

回答

4

您正在犯的錯誤是您試圖從單個節點複製整個鏈/列表。這在列表節點的副本中沒有太大的意義。使複製ctor只複製成員的值,不要遞歸。複製整個鏈/列表是LinkedList類的工作。

+0

+1「是」LinkedList「類的工作。複製單個節點在某些算法中可能很有用,但通常你甚至不想管理單個節點。 – 2011-02-24 20:33:46

0

只要將next和prev設置爲null,而不管被複制的節點的next和prev值如何。編寫一個單獨的函數來複制節點及其所有子節點,這些節點將用於複製整個列表。