Этот вопрос может быть похож на некоторых других; однако мой вопрос здесь относится к проблеме Visual C++. Следующий код для удаления двоичного дерева отлично работает с компилятором GNU C++.
Определение класса Tree_Node:
class Tree_Node
{
friend class Binary_Tree;
public:
typedef int node_type;
node_type& data()
{
return value;
}
void data(node_type key)
{
this->value = key;
}
Tree_Node(node_type key) : value(key) {}
~Tree_Node();
private:
node_type value = 0;
Tree_Node* right = nullptr;
Tree_Node* left = nullptr;
};
Деструктор двоичного дерева Определение:
Binary_Tree::~Binary_Tree()
{
deleteTree(root);
}
void Binary_Tree::deleteTree(Tree_Node* node)
{
if (node)
{
deleteTree(node->left);
deleteTree(node->right);
cout << node->data();
delete node;
}
}
Однако, давая Visual C++ попытку, тот же код выдаёт пару странных ошибок:
Ошибка 1 ошибка LNK2019: неразрешенный внешний символ "public: __thiscall Tree_Node :: ~ Tree_Node (void)" (? 1Tree_Node @@QAE @XZ), на который ссылается функция "public: void * __thiscall Tree_Node ::" скалярный удаляющий деструктор "(без знака int) "(?? _ GTree_Node @@QAEPAXI @Z) E:\Workspace\BinaryTree\BinaryTree\BinaryTree_Methods.obj
Ошибка 2 ошибки LNK1120: 1 нерешенные внешние
E:\Workspace\BinaryTree\Debug\BinaryTree.exe
Проблема, похоже, возникает конкретно из delete node;
выражение. Что мне здесь не хватает?
Вы сделали деструктор для узла?
Подобно Declare и define ~ Tree_Node()
=default
сделал свое дело. Сначала я размышлял о другой стратегии удаления, где BinaryTree
удаляет свой root
а деструктор Tree_Node
удаляет его left
и right
потомков, но вместо этого попробовал это и забыл реализовать деструктор Tree_Node
. Я удивлен тем, как это работало с g++
тогда?