2013-06-29 42 views
0

我想用C++實現一個通用的樹結構 - 帶類! - 這樹是由一個鍵(這在我的情況是整數)組成和leftChild和rightChild屬性,這應該是兩個相同的類型樹本身在C++中具有相同類的屬性

在CI的可以做到這一點,如:

typedef struct avl { 
    int key; 
    int bf; 
    struct avl *leftChild; 
    struct avl *rightChild; 
} AVLTree; 

我嘗試了在我的C++以下代碼:

class MTree { 
    public: 
     int key; 
     int bf; 

     MTree leftChild; 
     MTree rightChild; 

     MTree() {} 
     ~MTree() {}; 
} 

但它不會工作,它給了我下面的錯誤信息:

mtree-ops.cpp:12: error: field ‘leftChild’ has incomplete type

mtree-ops.cpp:13: error:error: field ‘rightChild’ has incomplete type

所以你看,貌似我不能說我的課有自己的類型的屬性,因爲這就像試圖要參考的東西,根本不存在在的時候定義。這怎麼可以用C++類來完成?

回答

2

(我不能發表評論。)

總之,MTree leftChild將有兩個自己的孩子MTree,每個將有兩個孩子,等等。因此,MTree對象將會無限大,因爲它們將包含無限多的MTree實例。

參見this question,它基本上相同。如上所述,您必須訴諸參考或指向兒童的指示,給予個體有限大小的個體。例如,

class MTree 
{ 
[...] 
public: 
    MTree* leftChild; 
    MTree* rightChild; 
}; 

(你可以用MTree&取代MTree*

0

我覺得你的代碼看起來應該是這樣

class MTree { 
    public: 
     int key; 
     int bf; 

     MTree * leftChild; 
     MTree * rightChild; 

     MTree() {} 
     ~MTree() {}; 
} 
1

這裏是idomatic C++ 11的方式去做:

#include <memory> 
class MTree { 
    public: 
    int key; 
    int bf; 

    std::unique_ptr<MTree> leftChild; 
    std::unique_ptr<MTree> rightChild; 

    MTree():key(0), bf(0) {} 
    ~MTree() {}; 
}; 

std::unique_ptr是一個智能指針,下一個t o零開銷表示包含struct擁有所有權的指針,可以是nullptr

要添加一個孩子,只是leftChild.reset(new MTree);

當父被破壞,所有的孩子都自動銷燬。如果您想要從父母處領養一個孩子,請執行std::unique_ptr<MTree> branch = std::move(parent.leftChild);,該權利聲明對左側孩子擁有所有權並將其從父母中移除。

如果您只想要一個非擁有指針,請使用parent.leftChild.get()。如果你想訪問左邊的孩子的keyparent.leftChild->key會做(注意:你負責檢查nullptr

相關問題