C++ 从具有私有内部类C++;

C++ 从具有私有内部类C++;,c++,class,inheritance,tree,avl-tree,C++,Class,Inheritance,Tree,Avl Tree,所以我有一个任务,我需要使用一个秩二叉树。不久前,我已经实现了一个模板AVL树(C++),因此我考虑将其作为基础并添加到其中。 由于我不想重复代码并使用现有的代码,所以我考虑创建一个从AVL继承的秩树类。 如何使用我所拥有的创建模板秩AVL树? 有没有办法创建一个内部RankNode类并让它从AVL的私有节点类继承 /* AvlTree class */ template<typename KeyType, typename DataType> class AvlTree {

所以我有一个任务,我需要使用一个秩二叉树。不久前,我已经实现了一个模板AVL树(C++),因此我考虑将其作为基础并添加到其中。 由于我不想重复代码并使用现有的代码,所以我考虑创建一个从AVL继承的秩树类。 如何使用我所拥有的创建模板秩AVL树? 有没有办法创建一个内部RankNode类并让它从AVL的私有节点类继承

/* 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>;
};
/*AvlTree类*/
模板
类AvlTree{
类AvlTreeNode;
AvlTreeNode*根;
内特树;
void clearTree(AvlTreeNode*节点);
void updateBF(AvlTreeNode*&node);//将节点的BF从根节点更新到给定节点
void updateHeight(AvlTreeNode*&node);//更新从根节点到给定节点的节点高度
void balanceTree(AvlTreeNode*&节点);
void rotateLeft(AvlTreeNode*&节点);
void rotateRight(AvlTreeNode*&节点);
void insertFrom(const-KeyType&key、const-DataType&data、AvlTreeNode*&node);
AvlTreeNode*&findNext(AvlTreeNode*&节点、AvlTreeNode*&当前、AvlTreeNode*&父节点);
AvlTreeNode*&treeNav(AvlTreeNode*&node);
void deleteLeaf(AvlTreeNode*&节点);
void deleteOneSon(AvlTreeNode*&节点);
void deletetetwonson(AvlTreeNode*&节点);
void removeFromTree(const-KeyType&key,AvlTreeNode*&node);
AvlTreeNode*查找(键类型键、AvlTreeNode*&节点);
void inOrderAux(键类型**键,AvlTreeNode*&节点,int&i);
在OrderrangeDaux中无效(键类型**键,AvlTreeNode*&节点,常量键类型&开始,常量键类型&结束,int&i);
在OrderManagedCountaux中无效(AvlTreeNode*&节点,常量键类型&开始,常量键类型&结束,int&i);
公众:
AvlTree();
虚拟~AvlTree();
//AvlTree(const AvlTree&tree);
数据类型getData(常量键类型和键);
无效设置数据(常量键类型和键,常量数据类型和数据);
无效插入(常量键类型和键、常量数据类型和数据);
无效删除(常量键类型和键);
void inoorder(int*size,KeyType**keys);//获取Keyarray inoorder中的所有值
按顺序无效(整数*大小、键类型**键、常量键类型和开始、常量键类型和结束);
bool存在(常量键类型和键);
} ;
/*AvlTreeNode类*/
模板
类AvlTree::AvlTreeNode{
键型键;
数据类型数据;
int-bf;
int height;//子树的高度
AvlTreeNode*左;
AvlTreeNode*右;
AvlTreeNode(键型键,数据类型数据,AvlTreeNode*left=NULL,AvlTreeNode*right=NULL):键(键),数据(数据),bf(0),高度(0),左(左),右(右){}
~AvlTreeNode(){}
朋友级AvlTree;
};
编辑:我找到了我一直在寻找的答案。我需要的代码如下所示:

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


    };
};

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

    };
};
模板
甲级{
受保护的:
B类{
};
};
模板
丙类:甲{
受保护的:
D类:A::B{
};
};

您可以将新类标记为base的
朋友(坏主意,从设计角度来看),或者保护那些私有成员(毕竟
受保护的
就是为了这个)


至于为什么
friend
不是这里最好的主意:首先,基类不应该关心派生类。第二,如果你想扩展某事物,那么某事物应该首先(或追溯)成为可扩展的;也就是说,它应该将可能暴露于派生类的成员标记为受保护的。否则,该类将被锁定;因此,它发出了一个简单的信号:我的原始创建者不希望我被扩展。

您可以将新类标记为base的
朋友(坏主意,从设计角度来看),或者保护那些私有成员(毕竟
受保护的


至于为什么
friend
不是这里最好的主意:首先,基类不应该关心派生类。第二,如果你想扩展某事物,那么某事物应该首先(或追溯)成为可扩展的;也就是说,它应该将可能暴露于派生类的成员标记为受保护的。否则,该类将被锁定;因此,它发出了一个简单的信号:我最初的创造者不希望我被扩展。

也许可以提到为什么
朋友
在这里是个坏主意。类似于“基类不需要了解其子类”的内容。如果我将节点(私有)类设置为受保护的,这会让我重载它并向其添加秩字段和函数吗?编辑:澄清一下,我不希望节点类暴露于继承类,而是希望能够“添加到它”。@Shookie,如果需要扩展成员类型,那么需要暴露它;这就是规则,所以你的说法是自相矛盾的。@Griwes:那么,我有没有办法在我已经拥有的AVL实现的基础上进行构建呢?我的意思是,秩树只是另一个二叉树,每个节点都有额外的数据(据我所知)。如果我实现一个秩树,它将是相同的,除了节点类,它将有另一个字段和一些其他函数。我只是觉得让它从AVL继承是一种很好的编程方式。@Shookie,因为你到处都在使用指针,是的(多态性只会完成它的工作,如果它真的只是每个节点中的额外数据的话)。也许可以提一下为什么
朋友
在这里是个坏主意。类似于“基类不需要了解其子类”的内容。如果我将节点(私有)类设置为受保护的,这会让我重载它并向其添加秩字段和函数吗?编辑:澄清一下,我不希望节点类暴露于继承类,而是希望能够“添加到它”。@Shookie,如果需要扩展成员类型,那么需要暴露它;这就是规则,所以你的说法是自相矛盾的。@Griwes:那么,我有没有办法在我已经拥有的AVL实现的基础上进行构建呢?我的意思是,秩树只是另一个二叉树,每个节点中都有额外的数据(就我而言)