2

したがって、これは、左、右、親、およびデータを持つ二分探索木の基本クラスです。

template<class Data>
class BSTNode
{
public:

    /** Constructor.  Initialize a BSTNode with the given Data item,
     *  no parent, and no children.
     */
    BSTNode(const Data & d) : data(d)
    {
        left = right = parent = 0;
    }


    BSTNode<Data>* left;
    BSTNode<Data>* right;
    BSTNode<Data>* parent;
    Data const data;   // the const Data in this node.

    /** Return the successor of this BSTNode in a BST, or 0 if none.
     ** PRECONDITION: this BSTNode is a node in a BST.
     ** POSTCONDITION:  the BST is unchanged.
     ** RETURNS: the BSTNode that is the successor of this BSTNode,
     ** or 0 if there is none.
     */
    BSTNode<Data>* successor()
    {
        BSTNode<Data>* cursor;
        BSTNode<Data>* par;
        cursor = this->right;
        par = this->parent;

        if (this->right != NULL)
        {
            while (cursor->left != NULL) {
                cursor = cursor->left;
            }
            return cursor;
        }
        if ((this->right == NULL) &&  (this == par->left))
            return this->parent;

        if ((this->right == NULL) && (this == par->right))
        {
            do
            {
                cursor = par;
                par = par->parent;
                if (par ==  NULL)
                {return cursor;}
            } while(cursor != par->left);
            return par;
        }
        if (this->right == NULL && this->parent == NULL)
            return NULL;

        return NULL;
    }
};

サブクラスはRSTNodeであり、BSTNodeのすべてのメンバーを使用し、その上に優先順位を追加することになっています。

template<class Data>
class RSTNode: public BSTNode<Data>
{
public:
    int priority;

    RSTNode(Data const & d)
        : BSTNode<Data>(d)
    {
        //call a random number generator to generate a random priority
        priority = rand();
    }
};

問題は、RSTNodeが何らかの理由でBSTNodeのメンバーを認識しないため、RSTNodeのコンストラクターを実装する方法がわからないことです。この情報を継承することになっているので、それらを認識する必要があることを私は知っています。どんな助けでも適用されます。

4

3 に答える 3

0

これは、データメンバーのデフォルトのスコープがであるためですprivateprotectedサブクラスでそれらにアクセスするかのようにそれらを宣言する必要があります。

BSTNodeさらに良いことに、初期化値を渡すことができるコンストラクターを追加し、コンストラクターからこれを呼び出します。これRSTNodeは、メンバーの存続期間を管理する基本クラスである必要があるためです。

于 2012-10-26T07:35:44.790 に答える
0

私がこれを正しく読んだ場合、テンプレート化されたクラスから継承しようとしています:

class RSTNode: public BSTNode<Data>

BSTNodeのクラス定義がテンプレート化されたクラスではない場合はどうなりますか?

class BSTNode {

これは問題の一部ですか、それとも間違ったコードを貼り付けましたか?

BSTNodeをテンプレート化することで修正できます

template <typename T> class BSTNode {

または、テンプレート化されていないBSTNodeからRSTNodeを派生させます。

class RSTNode: public BSTNode

ただし、自分が書いたことを試したという事実は、クラス定義をそれほど深く理解していないこと、および派生クラスコンストラクターで基本クラスパラメーターを直接設定しようとしていること、およびそれらを公開したことで、オブジェクト指向設計についてもっと学ぶ必要があると私は信じるようになります-したがって、これは技術的に問題を解決するかもしれませんが、あなたが抱えている問題に関しては氷山の一角にすぎません。

また、「何らかの理由でBSTNodeのメンバーを認識しない」と言っても、それを実行しようとしたときにコンパイラーの正確な出力ではないと思われるため、あまり役に立ちません。

于 2012-10-26T08:31:39.470 に答える
0

OK、これをVisualStudioでコンパイルしました...

template<class Data>
class BSTNode
{
public:

    /** Constructor.  Initialize a BSTNode with the given Data item,
     *  no parent, and no children.
     */
    BSTNode(const Data & d) : data(d)
    {
        left = right = parent = 0;
    }


    BSTNode<Data>* left;
    BSTNode<Data>* right;
    BSTNode<Data>* parent;
    Data const data;   // the const Data in this node.
};

template<class Data>
class RSTNode : public BSTNode<Data>
{
public:
   int priority;

   RSTNode(Data const & d)
      : priority(rand()),
        BSTNode<Data>(d)
   {
      left = 0; //Accessible because public
      right = 0;
      parent = 0;
   }
};

int _tmain(int argc, _TCHAR* argv[])
{
   RSTNode<std::string> node(std::string("test"));
    return 0;
}

コンパイルされたため、アクセスの問題はありません。上記の他のポスターのように、あなたは問題の詳細を投稿していないか、基本的なことを理解していないようです。

>問題は、RSTNodeが何らかの理由でBSTNodeのメンバーを認識しないため、RSTNodeのコンストラクターを実装する方法がわからないことです。>この情報を継承することになっているので、それらを認識する必要があることを私は知っています。どんな助けでも適用されます。

上記のコードはコンストラクターを実装します。または、特に左、右、および親のセットが必要な場合は、次のものが必要になります。

BSTNode(const Data & d, BSTNode* l, BSTNode* r, BSTNode* p) 
       : data(d),
       left(l),
       right(r),
       parent(p)
    {
    }

次に、それをRSTNodeで使用するか、またはその1つに渡されたRSTNode用の同様のものを使用します。

RSTNode(Data const & d, BSTNode* l, BSTNode* r, BSTNode* p)
   : priority(rand()),
     BSTNode<Data>(d,l,r,p)
{
}

それが少し役立つことを願って、ctorのメンバーに直接アクセスするよりも初期化リストを優先する必要があることに注意してください。ただし、基本クラスを変更できない場合は、次のことを行う必要があります...


訂正されたタイプミス-データ->データ

于 2012-10-26T11:47:44.950 に答える