Q: Как я могу вставить этот объект с именем Packet в BST?
A: Чтобы создать связь между BST и классом Packet, вы должны определить ее каким-то образом.Передовая практика требует ассоциации, которая налагает наименьшее количество связей между связанными классами.
Я реализовал ассоциацию в вашем решении в месте, которое мне показалось наиболее подходящим, т.е.указатели rlink и llink структуры Node класса BST.
// Store packet here (for instance Packet *data or something)...
Packet* rlink, * llink;
Отношения - это единственный способ получить доступ к getPartId () из объекта Node или BST.Хотя класс Packet не управляет никакими ресурсами, поэтому он не требует управления памятью, ассоциация - это просто причудливое слово для слабосвязанных отношений между классами, как в данном случае.
Будьте осторожны при рекурсивном вызове функций, как в void BST::insert(Node *&p, Node *newNode)
.Вы не должны вызывать функцию рекурсивно без условия выхода и никогда не использовать рекурсию, если только вам это не нужно, поскольку итерации являются альтернативой экономии стековой памяти.Я не видел необходимости в рекурсии в вашей функции вставки, поэтому я удалил ее.Я надеюсь, что то, что я заменил их, пригодится вам:
void BST::insert(Packet& p) {
Packet* newPacket = new Packet(p);
insert(root, newPacket);
}
void BST::insert(Node*& p, Packet* newPacket) {
if (p == nullptr) {
p = new Node;
p->llink = newPacket;
}else if ((p->llink->getPartId()) > newPacket->getPartId()){
p->llink = newPacket;
}else {
p->rlink = newPacket;
}
}
Затем я сказал:
void BST::preorderTraversal(const Node* p) const {
if (p != nullptr) {
cout << p->llink->getPartId() << " \n";
}
}
void BST::destroyTree(Node*& p) {
if (p != nullptr) {
delete p;
p = nullptr;
}
}
Как я уже сказал, отношения - это единственноеспособ получить доступ к getPartId () из объекта Node или BST.
Что касается комментариев, я согласен.Инкапсуляция требует, чтобы все члены данных были приватными, и только когда это необходимо, выявляются методы.Мое решение позволяет вам сохранять функцию
частной: void insert(Node*& p, Packet* newPacket);
Поскольку вы полностью скрыли Node, перегрузив preorderTraversal()
Хорошая работа и надеюсь, что я помог!