【发布时间】:2014-02-27 02:20:05
【问题描述】:
这个问题可能与其他一些问题相似;但是,我的问题与 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) 中引用 函数“公共:无效* __thiscall Tree_Node::`标量删除 析构函数'(unsigned int)" (??_GTree_Node@@QAEPAXI@Z) E:\Workspace\BinaryTree\BinaryTree\BinaryTree_Methods.obj
错误 2 错误 LNK1120: 1 未解决的外部
E:\Workspace\BinaryTree\Debug\BinaryTree.exe
问题似乎是由delete node; 语句引起的。我在这里想念什么?
【问题讨论】:
-
Tree_Node.cpp 是否与 Binary_Tree.cpp 编译在同一个项目中?
-
嗯,它们是同一个项目的一部分。类定义 Tree_Node 和 BinaryTree 位于单独的头文件 TreeHeader.h 中。 Binary_Tree 的方法定义在文件 BinaryTree_Methods.cpp 中。但是,是用 Visual C++ 编译的头文件
-
检查您的
Tree_Node并确保在类decl 中有已实现~Tree_Node()或没有~Tree_Node();声明。看起来您在类 decl 中声明了一个,但没有实现它。这是一个全有或全无的交易。您必须声明 并 实现它,或者不这样做并使用默认析构函数(这可能不适合您的情况,但这是一个不同的问题)。 -
显示 Node 的定义和析构函数的定义(如果显式定义)。
-
@Chatterjee destructor,如果你需要默认破坏之外的东西(即你有自己的清理,你需要的不仅仅是允许你持有-价值枯萎)。在大多数情况下,只使用默认销毁就可以了,但有时并非如此。
标签: c++ visual-c++ binary-tree