2012-10-22 88 views
0

我有以下代碼:C++:指定值的指針成員

template<class T> 
class RandomTreeNode { 
private: 
    RandomTreeNode<T> *left; 
    RandomTreeNode<T> *right; 
public: 
    RandomTreeNode(): left(0), right(0) {} 

    void create_left_child(){ left = &RandomTreeNode<T>();} 
    void create_right_child(){ right = &RandomTreeNode<T>();} 

但是,這給了我一個編譯錯誤,因爲我指着一個臨時變量的地址。我不希望在函數結尾處銷燬新的RandomTreeNode,我該如何實現?

+2

如果你'新'他們,那麼,不像臨時工,它們不會在函數結束時被銷燬。那又是什麼問題呢? – ybungalobill

+1

很高興看到你決定遵循我的[建議](http://stackoverflow.com/questions/13015708/c-incomplete-type#comment17663775_13015755)從你的最後一個問題! /諷刺 – Praetorian

+0

@Praetorian他爲什麼會這樣? /諷刺:P –

回答

8

用途:

void create_left_child() 
{ 
    left = new RandomTreeNode<T>(); 
} 

void create_right_child() 
{ 
    right = new RandomTreeNode<T>(); 
} 

記住你要刪除它們時,你不再需要他們(可能在整個樹遭到破壞,或者在特定的節點被刪除)。

+0

謝謝,我會接受一次SO讓我(必須等待一定的時間) – Aly

+0

絕對正確。當然,現在也會有相應的「刪除」調用。 –

+4

@FredLarson和複製/移動構造函數,賦值運算符... –

4

以下是我會做:

template<class T> 
class RandomTreeNode { 
    std::unique_ptr<RandomTreeNode<T> > left; 
    std::unique_ptr<RandomTreeNode<T> > right; 

    RandomTreeNode(): left(0), right(0) {} 

    void create_left_child(){ left.reset(new RandomTreeNode<T>());} 
    void create_right_child(){ right.reset(new RandomTreeNode<T>());} 
} 

有會是沒有必要的析構函數,並沒有手動內存管理。