Динамическое связывание в C ++?

Мне нужно немного разъяснений по динамическому связыванию в C ++.
Я объясняю свою проблему.
Я должен реализовать словарь с помощью бинарного дерева поиска. Я решил реализовать также дерево AVL (самобилансирующееся дерево двоичного поиска). Я успешно реализовал два класса: BST (дерево двоичного поиска) и AVL, расширяющий BST. Моя программа работает правильно.
Моя цель состоит в том, чтобы иметь только один указатель, который я могу переключить с класса BST на класс AVL и попросить пользователя «какую структуру вы бы хотели использовать?» в начале программы.
Остальная часть кода одинакова, потому что BST и AVL имеют одинаковые имена методов (даже если они делают разные вещи -> переопределение).
Я достиг своей цели следующим образом:

cout << "whitch structure would you like to use? [1] for BST, [2] for AVL";
short choise;
cin >> choise;

BST a;
AVL b;
BST* dictionary;

if (choise == 1)
dictionary = &a;
else if (choise == 2)
dictionary = &b;
.
.
.
dictionary->doSomething();

Мой вопрос:
Это правильный путь? И это пример динамического связывания?

Спасибо за ваше внимание, и мне жаль, если я не объяснил свою проблему правильно, но это мой первый пост на этом замечательном сайте!

0

Решение

Это пример динамического связывания?

Если предположить, AVL производный BST, тогда да.

Это правильный путь?

Если предположить, AVL производный BST, тогда да.

Это Лучший способ продолжить? Ну, возможно, нет. Ты всегда инстанцируешь и то и другое виды деревьев, даже если когда-либо используется только один. Это кажется расточительным.

Более распространенный подход заключается в их условном построении:

std::unique_ptr<BST> dictionary;
if (choise == 1)
dictionary.reset(new BST());
else if (choise == 2)
dictionary.reset(new AVL());

// ...

assert(dictionary.get());
dictionary->doSomething();

Если у вас нет смертельной аллергии на динамическое распределение, или у вас нет кучи в вашей системе, или вы делаете что-то в сверхплотном цикле где-то, этот подход является более традиционным.

В конечном счете, это почти то же самое.

5

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

Если AVL класс публично наследует от BST класс, тогда да, это правильно.

0

Это пример полиморфизма, динамическое связывание является выражением полиморфизма во время выполнения.

С АВЛ это BST, вы должны иметь публичное наследование AVL от BST.
Тогда да, ваше приложение сможет полиморфно обрабатывать оба типа.

0

Другой подход может заключаться в том, чтобы отделить алгоритм балансировки от общей структуры данных BST. Например, вы можете использовать AVL или RBT или что-то еще.

алгоритм для использования может быть передан в конструкторе.

0
По вопросам рекламы [email protected]