그래서 순위 바이너리 트리를 사용해야하는 과제가 있습니다. 저는 이미 템플릿 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{
};
};
어쩌면 _why_ 'friend'는 여기에 나쁜 생각입니다. "기본 클래스는 자손에 대한 지식이 필요하지 않아야합니다." – jpm
Node (개인) 클래스를 Protected로 설정하면 과부하가 걸리고 순위 필드와 함수가 추가됩니다. 편집 : 명확히하기 위해 Node 클래스가 상속받은 클래스에 노출되도록하려는 것이 아니라 "추가"할 수 있기를 바랍니다. – Shookie
@Shookie, 회원 유형을 확장해야하는 경우 노출이 필요합니다. 그것은 규칙이므로 진술은 자기 모순입니다. – Griwes