我有一个使用根节点创建的二叉树类,并且可以根据代码中的需要向其添加节点,但是我在删除节点时遇到了麻烦,因为我用 TNodePtr 指向它们,并且它是不兼容的使用 TNode 键入。 目前,我有这种删除节点的递归方法,一旦不兼容的类型被排序,该方法就应该起作用。谢谢。
Destructor TTree.Destroy;
procedure FreeSubnodes(Node: TNodePtr);
begin
if Assigned(Node.Left) then
FreeSubnodes(Node.Left);
if Assigned(Node.Right) then
FreeSubnodes(Node.Right);
Delete(Node);
end;
begin
FreeSubnodes(Root);
inherited;
end;
编辑 2010 年 4 月 3 日: 给出的错误是这样的: [警告] SystemBuild.pas(50):方法“Destroy”隐藏基类型“TObject”的虚拟方法 [错误] SystemBuild.pas(84):类型不兼容
第84行是删除(节点);
我这样声明节点:
type
TNodePtr = ^TNode;
TNode = Record
Data:String;
Left:TNodePtr;
Right:TNodePtr;
end;
树是这样的:
Type
TTree = Class
Private
Root:TNodePtr;
Public
Function GetRoot:TNodePtr;
Constructor Create;
Destructor Destroy;
end;
最佳答案
您看到的错误是因为我在给your previous question的答案中犯了一个错误。 。 I wrote Delete
当我应该写Dispose
时。我道歉。那么,这是正确的析构函数实现:
destructor TTree.Destroy;
procedure FreeSubnodes(Node: PNode);
begin
if Assigned(Node.Left) then
FreeSubnodes(Node.Left);
if Assigned(Node.Right) then
FreeSubnodes(Node.Right);
Dispose(Node);
end;
begin
FreeSubnodes(Root);
inherited;
end;
该错误并不是说 TNodePtr
与 TNode
不兼容。该错误只是说“类型不兼容”,因为编译器不知道 Delete
应该接收什么类型。它是一个编译器魔法函数,接受多种不同的参数类型,其中没有一个与 TNodePtr
兼容。
您看到的第一条编译器消息是关于您的 Destroy
方法,该方法从基类中隐藏了该方法。它不对您所看到的问题负责,但您最终会注意到一个问题,因为您的析构函数永远不会被调用。当您调用Free
时,它将调用TObject的 Destroy
方法,而不是您的新版本。要让您的版本被调用,您需要将您的版本标记为覆盖继承的版本。然后,当TObject.Free
调用Destroy
时,控制权将首先转到您的版本,然后当您调用inherited
时转到基类的版本。将声明更改为:
destructor Destroy; override;
关于Delphi删除TNode,不兼容类型TNodePtr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2370273/