C++ 递归二叉树删除的析构函数代码在Visual C+中不起作用+;2012

C++ 递归二叉树删除的析构函数代码在Visual C+中不起作用+;2012,c++,visual-c++,binary-tree,C++,Visual C++,Binary Tree,这个问题可能与其他一些问题类似;但是,我这里的问题是关于VisualC++问题。下面的删除二进制树的代码使用GNU的C++编译器工作得很好。 树节点类定义: class Tree_Node { friend class Binary_Tree; public: typedef int node_type; node_type& data() { return value; } void data(node_type k

这个问题可能与其他一些问题类似;但是,<强>我这里的问题是关于VisualC++问题<强>。下面的删除二进制树的代码使用GNU的C++编译器工作得很好。 树节点类定义:

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;
    }
}
二叉树析构函数定义:

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;
    }
}
Binary_-Tree::~Binary_-Tree()
{
删除树(根);
}
无效二叉树::删除树(树节点*节点)
{
如果(节点)
{
删除树(节点->左侧);
删除树(节点->右侧);
cout数据();
删除节点;
}
}

然而,在给出VisualC++尝试的同时,同样的代码给出了一些奇怪的错误:

错误1错误LNK2019:未解析的外部符号“public:\u thiscall” 树节点::~Tree\u节点(void)”(??1树节点@@QAE@XZ)引用于 函数“public:void*\uu thiscall Tree\u Node::`scalar deleting 析构函数“(无符号整数)”(??\u GTree\u节点@@QAEPAXI@Z) E:\Workspace\BinaryTree\BinaryTree\BinaryTree\u Methods.obj

错误2错误LNK1120:1个未解析的外部
E:\Workspace\BinaryTree\Debug\BinaryTree.exe


问题似乎是由
delete节点引起的语句。我错过了什么

是否为节点制作了析构函数


像Declare and define~Tree\u Node()

一样,Tree\u Node.cpp是否与Binary\u Tree.cpp在同一项目中编译?嗯,它们是同一项目的一部分。类定义树\节点和二进制树位于单独的头文件TreeHeader.h中。二进制树的方法定义位于文件BinaryTree\u Methods.cpp中。但是,是否在Visual C++中编译头文件请检查
树节点
,并确保存在已实现的
~Tree\u节点()
,或者没有
~Tree\u节点()类decl中的声明。看起来您在类decl中声明了一个,但没有实现它。这是一个全有或全无的交易。您必须声明并实现它,或者不声明并实现它并使用默认析构函数(这可能不适合您的情况,但这是另一个问题)。显示节点的定义和析构函数的定义(如果它是显式定义的)。@Chatterjee destructor,如果您需要的是默认销毁之外的东西(即,您需要的是您自己的清理,而不仅仅是允许您持有的价值萎缩),那么这可能是不合适的。在大多数情况下,只接受默认的破坏是好的,但有时不是。我的坏<代码>=默认值
成功了。我最初考虑的是一种不同的删除策略,
BinaryTree
会删除它的
root
,而
Tree\u节点
析构函数会删除它的
子节点,但是尝试了这个方法,却忘记了实现
Tree\u节点
析构函数。我很惊讶这是如何与
g++
then一起工作的?@Chatterjee这不是原因。Specifying=default是析构函数的定义。@vladfrommosco我的意思是我忘了定义
树\u节点
析构函数;我只声明了它(参见上面更新的代码)。用
=default
定义它使代码工作。