Код деструктора для рекурсивного удаления двоичного дерева, не работающего в Visual C ++ 2012

0

Этот вопрос может быть похож на некоторых других; однако мой вопрос здесь относится к проблеме 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; выражение. Что мне здесь не хватает?

  • 0
    Tree_Node.cpp скомпилирован в том же проекте, что и Binary_Tree.cpp?
  • 0
    Ну, они являются частью одного проекта. Определения классов Tree_Node и BinaryTree находятся в отдельном заголовочном файле TreeHeader.h. Определения методов для Binary_Tree находятся в файле BinaryTree_Methods.cpp. Тем не менее, файлы заголовков скомпилированы в Visual C ++
Показать ещё 6 комментариев
Теги:
visual-c++
binary-tree

1 ответ

2
Лучший ответ

Вы сделали деструктор для узла?

Подобно Declare и define ~ Tree_Node()

  • 0
    Виноват! =default сделал свое дело. Сначала я размышлял о другой стратегии удаления, где BinaryTree удаляет свой root а деструктор Tree_Node удаляет его left и right потомков, но вместо этого попробовал это и забыл реализовать деструктор Tree_Node . Я удивлен тем, как это работало с g++ тогда?
  • 0
    @Chatterjee это не причина. Задание = по умолчанию является определением деструктора.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню