Методы получения в рекурсивном классе с указателями на другие экземпляры класса - PullRequest
0 голосов
/ 09 декабря 2018

Для школьного проекта мне нужно создать BinarySearchTree для кортежа индекса и значения типа T, и я решил сделать это, используя левый и правый дочерние указатели (в других случаях, но не теряйте меня).

Чтобы сделать класс немного более реалистичным и читабельным, я построил 3 разных класса: Tree, BinaryTree и BinarySearchTree с наследованием.

Я объявил метод получения и установки левого и правого дочерних элементов в BinaryTreeкласс и класс выглядят так:

template <typename T>
class ArbreBinaire : public Arbre<T>
{
private:
  ArbreBinaire<T>* _leftChild;
  ArbreBinaire<T>* _rightChild;

public:
  ArbreBinaire(lu index = 0, T element = T(0), ArbreBinaire<T>* lchild = nullptr, ArbreBinaire<T>* rchild = nullptr) :
    Arbre<T>(index, element), _leftChild(lchild), _rightChild(rchild) {};

  virtual ArbreBinaire<T>* getLC() const { return _leftChild; }
  virtual ArbreBinaire<T>* getRC() const { return _rightChild;}

  void setLC(ArbreBinaire<T>* lc) {  _leftChild = lc; lc->setParent(this); }
  void setRC(ArbreBinaire<T>* rc) { _rightChild = rc; rc->setParent(this); }


  virtual ~ArbreBinaire() = default;
};

И в моем BinarySearchTree в некоторых местах мне нужно пройти по моему дереву (чтобы вставить или найти пример).И вот, наконец, мой вопрос: каков наилучший способ получить левого потомка моего объекта типа BinarySearchTree и сохранить непрерывность (BST, у которого BST левый и BST правый дочерний)

IМожно подумать о нескольких вариантах:

  1. виртуальный метод получения и установки и переопределение его в каждом производном классе, но есть 2 других "проблемы" с этим решением.
  2. Должны ли у меня быть 2 других члена в моем BST, которые будут иметь тип BST * и в основном будут указывать на тот же объект, что и в моем BinaryTree?

    1. Должен ли я просто переопределить мои геттеры, чтобы вернуть версию dynamic_cast, подобную этой: BST<T>* getLC() { return dynamic_cast<BST<T>*> (this->BinaryTree::getLC()) }?

    2. Помещение всех моих членов, получателей и установщиков в мой класс BST (но это идет вразрез с определением BinaryTree, базовый класс: BinaryTree без детей не является BinaryTree)

3. Просто приведение типов каждый раз, когда мне нужно, чтобы получить моего левого или правого ребенка
4.Кастинг каждый раз, когда мне нужно использовать метод в BST (производныйкласс)?
5. Есть еще предложения?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...