Мне нужно немного разъяснений по динамическому связыванию в 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();
Мой вопрос:
Это правильный путь? И это пример динамического связывания?
Спасибо за ваше внимание, и мне жаль, если я не объяснил свою проблему правильно, но это мой первый пост на этом замечательном сайте!
Это пример динамического связывания?
Если предположить, 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();
Если у вас нет смертельной аллергии на динамическое распределение, или у вас нет кучи в вашей системе, или вы делаете что-то в сверхплотном цикле где-то, этот подход является более традиционным.
В конечном счете, это почти то же самое.
Если AVL
класс публично наследует от BST
класс, тогда да, это правильно.
Это пример полиморфизма, динамическое связывание является выражением полиморфизма во время выполнения.
С АВЛ это BST, вы должны иметь публичное наследование AVL от BST.
Тогда да, ваше приложение сможет полиморфно обрабатывать оба типа.
Другой подход может заключаться в том, чтобы отделить алгоритм балансировки от общей структуры данных BST. Например, вы можете использовать AVL или RBT или что-то еще.
алгоритм для использования может быть передан в конструкторе.