Наследование Super vs Subclass конструктора Переполнение стека

Так что это базовый класс для двоичного дерева поиска с левым, правым, родительским и данными.

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. Я знаю, что он должен распознавать их, поскольку он должен наследовать эту информацию. Любая помощь ценится.

2

Решение

Хорошо, я скомпилировал это в Visual Studio …

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. Я знаю, что он должен распознавать их, так как он должен наследовать эту информацию. Любая помощь ценится.

Приведенный выше код реализует конструктор, или, если вы хотите конкретно указать наборы left, right и parent, вам понадобится:

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

а затем использовать его в RSTNode или иметь аналогичный для RSTNode, который прошел к этому ….

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

Надеюсь, это немного поможет, обратите внимание, что вы должны предпочесть списки инициализатора для прямого доступа к членам в ctor. Но если вы не можете изменить базовый класс, вам нужно …


Исправлена ​​опечатка — данные -> Данные

0

Другие решения

Это потому, что область действия по умолчанию для членов данных private, Вы должны объявить их как protected если вы хотите получить к ним доступ в подклассе.

Еще лучше добавить конструктор в BSTNode что позволяет передавать значения инициализации и вызывать это из RSTNode конструктор, так как он должен быть базовым классом, управляющим временем жизни его членов.

0

Если я прочитал это правильно, вы пытаетесь наследовать от шаблонного класса:

class RSTNode: public BSTNode<Data>

Где ваше определение класса BSTNode не является шаблонным классом?

class BSTNode {

Это часть проблемы или вы вставили неправильный код?

Вы можете исправить это, используя шаблон BSTNode

template <typename T> class BSTNode {

или получение RSTNode из не шаблонного BSTNode:

class RSTNode: public BSTNode

тем не мение тот факт, что вы пытались понять, что вы написали, подразумевает, что вы на самом деле не понимаете определения классов на более глубоком уровне, и тот факт, что вы пытаетесь установить параметры базового класса непосредственно в конструкторе производного класса, и что вы ‘ если я сделаю их публичными, это заставит меня поверить, что вам нужно больше узнать об объектно-ориентированном дизайне — так что, хотя это может решить технически вашу проблему, это только верхушка айсберга, когда дело доходит до ваших проблем.

Также высказывание «по какой-то причине он не распознает членов BSTNode» не очень полезно, так как я подозреваю, что это не точный вывод вашего компилятора, когда вы пытаетесь это сделать.

0