2013-01-03 7 views
0

그래서 순위 바이너리 트리를 사용해야하는 과제가 있습니다. 저는 이미 템플릿 AVL 트리 (C++)를 구현했습니다. 그래서 기초로 사용하고 추가하는 방법을 생각했습니다. 코드를 복제하고 가지고있는 것과 작업하고 싶지 않기 때문에 AVL을 상속받을 등급 트리 클래스를 만드는 방법을 생각했습니다. 템플릿 순위 AVL 트리를 만드는 데 사용할 수있는 방법은 무엇입니까? 내부 RankNode 클래스를 만들고 AVL의 개인 노드 클래스에서 상속받는 방법이 있습니까?개인 내부 클래스가있는 클래스에서 상속 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_ 'friend'는 여기에 나쁜 생각입니다. "기본 클래스는 자손에 대한 지식이 필요하지 않아야합니다." – jpm

+0

Node (개인) 클래스를 Protected로 설정하면 과부하가 걸리고 순위 필드와 함수가 추가됩니다. 편집 : 명확히하기 위해 Node 클래스가 상속받은 클래스에 노출되도록하려는 것이 아니라 "추가"할 수 있기를 바랍니다. – Shookie

+0

@Shookie, 회원 유형을 확장해야하는 경우 노출이 필요합니다. 그것은 규칙이므로 진술은 자기 모순입니다. – Griwes

관련 문제