2013-01-03 61 views
0

所以我有一個任務,我需要使用一個秩二叉樹。我已經實現了一個模板AVL樹(C++),所以我想用它作爲基礎並添加它。 由於我不想複製代碼並使用我所擁有的東西,我想製作一個將從AVL繼承的等級樹類。 如何使用我必須創建的模板級AVL樹? 有沒有辦法創建一個內部RankNode類,並讓它從AVL的私有Node類繼承?從具有私有內部類的類繼承C++

/* AvlTree class */ 
template<typename KeyType, typename DataType> 
class AvlTree { 
    class AvlTreeNode; 
    AvlTreeNode* root; 
    int treeSize; 

    void clearTree(AvlTreeNode* node); 
    void updateBF(AvlTreeNode*& node); //updates the BF of the nodes from the root to the given node 
    void updateHeight(AvlTreeNode*& node); //updates the height of the nodes from the root to the given node 
    void balanceTree(AvlTreeNode*& node); 
    void rotateLeft(AvlTreeNode*& node); 
    void rotateRight(AvlTreeNode*& node); 
    void insertFrom(const KeyType& key, const DataType& data, AvlTreeNode*& node); 
    AvlTreeNode*& findNext(AvlTreeNode*& node, AvlTreeNode*& current,AvlTreeNode*& father); 
    AvlTreeNode*& treeNav(AvlTreeNode*& node); 
    void deleteLeaf(AvlTreeNode*& node); 
    void deleteOneSon(AvlTreeNode*& node); 
    void deleteTwoSons(AvlTreeNode*& node); 
    void removeFromTree(const KeyType& key, AvlTreeNode*& node); 
    AvlTreeNode* find(KeyType key, AvlTreeNode*& node); 
    void inOrderAux(KeyType** keys, AvlTreeNode*& node, int& i); 
    void inOrderRangedAux(KeyType** keys, AvlTreeNode*& node, const KeyType& start,const KeyType& end, int& i); 
    void inOrderRangedCountAux(AvlTreeNode*& node, const KeyType& start,const KeyType& end, int& i); 

public: 
    AvlTree(); 
    virtual ~AvlTree(); 
    //AvlTree(const AvlTree& tree); 
    DataType getData(const KeyType& key); 
    void setData(const KeyType& key, const DataType& data); 
    void insert(const KeyType& key, const DataType& data); 
    void remove(const KeyType& key); 
    void inOrder(int* size, KeyType** keys); //Gets all of the values in a Keyarray inorder 
    void inOrderRanged(int* size, KeyType** keys,const KeyType& start,const KeyType& end); 
    bool exists(const KeyType& key); 
} ; 

/* AvlTreeNode class */ 
template<typename KeyType, typename DataType> 
class AvlTree<KeyType,DataType>::AvlTreeNode { 
    KeyType key; 
    DataType data; 
    int bf; 
    int height; //The subtree's height 
    AvlTreeNode* left; 
    AvlTreeNode* right; 
    AvlTreeNode(KeyType key, DataType data, AvlTreeNode* left = NULL, AvlTreeNode* right = NULL):key(key), data(data), bf(0),height(0), left(left), right(right){} 
    ~AvlTreeNode(){} 
    friend class AvlTree<KeyType, DataType>; 
}; 

編輯:我找到了我正在尋找的答案。我所需要的代碼看起來是這樣的:

template<typename T> 
class A{ 
protected: 
    class B{ 


    }; 
}; 

template<typename T> 
class C : A{ 
protected: 
    class D :A<T>::B{ 

    }; 
}; 

回答

4

您可以標記新類爲基礎(壞主意,在設計方面)的friend,或使受保護的私有成員(這就是protected是,畢竟)。

至於爲什麼friend不是這裏最好的主意:一方面,基類不應該關心派生類。其次,如果你想擴大某些東西,那麼最初(或追溯)的東西應該可以擴展;也就是說,它應該將可能暴露給派生類的成員標記爲protected。否則,課程被鎖定;因此,它發送簡單的信號:我的原創者不希望我延長

+0

也許提到_why_'朋友'這裏是一個壞主意。像「基類不需要知道其後代」。 – jpm

+0

如果我使節點(私有)類受保護,是否允許我重載它並添加一個排序字段和函數? 編輯:爲了澄清,這不是我希望Node類暴露給繼承類,而是我希望能夠「添加到它」。 – Shookie

+0

@Shookie,如果你需要擴展成員類型,那麼你需要它暴露;這是規則,所以你的陳述是自相矛盾的。 – Griwes