0

そのため、ランク二分木を使用する必要がある課題があります。しばらく前にテンプレート AVL ツリー (C++) を既に実装していたので、それをベースとして使用して追加することを考えました。コードを複製して自分の持っているもので作業したくないので、AVL から継承するランク ツリー クラスを作成することを考えました。テンプレート ランク AVL ツリーを作成するために必要なものを使用するにはどうすればよいですか? 内部の RankNode クラスを作成し、AVL のプライベート Node クラスから継承させる方法はありますか?

/* 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

1 に答える 1

4

新しいクラスを基本としてマークするかfriend(設計上、悪い考えです)、それらのプライベート メンバーを保護することができます (protected結局のところ、それが目的です)。

ここでなぜfriend最善のアイデアではないのかについては、基本クラスは派生クラスを気にするべきではありません。第二に、何かを拡張したい場合は、その何かを最初に (またはさかのぼって) 拡張可能にする必要があります。つまり、派生クラスに公開される可能性のあるメンバーを としてマークする必要がありますprotected。それ以外の場合、クラスはロックインされます。そのため、単純なシグナルを送信します:元の作成者は拡張を望んでいませんでした

于 2013-01-03T22:19:00.900 に答える