gpt4 book ai didi

Delphi删除TNode,不兼容类型TNodePtr

转载 作者:行者123 更新时间:2023-12-02 03:58:41 25 4
gpt4 key购买 nike

我有一个使用根节点创建的二叉树类,并且可以根据代码中的需要向其添加节点,但是我在删除节点时遇到了麻烦,因为我用 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;

该错误并不是说 TNodePtrTNode 不兼容。该错误只是说“类型不兼容”,因为编译器不知道 Delete 应该接收什么类型。它是一个编译器魔法函数,接受多种不同的参数类型,其中没有一个与 TNodePtr 兼容。

您看到的第一条编译器消息是关于您的 Destroy 方法,该方法从基类中隐藏了该方法。它不对您所看到的问题负责,但您最终会注意到一个问题,因为您的析构函数永远不会被调用。当您调用Free时,它将调用TObject的 Destroy方法,而不是您的新版本。要让您的版本被调用,您需要将您的版本标记为覆盖继承的版本。然后,当TObject.Free调用Destroy时,控制权将首先转到您的版本,然后当您调用inherited时转到基类的版本。将声明更改为:

destructor Destroy; override;

关于Delphi删除TNode,不兼容类型TNodePtr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2370273/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com