Delphi删除TNode,不兼容类型TNodePtr

标签 delphi

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

相关文章:

Delphi 外观无闪烁

Delphi 10.4.2 "could not find wizard gexperts"启动错误

delphi - 使用 Delphi 在 Canvas 上每行一个字符绘制居中和中间文本

datetime - 获取当前日期的年份

regex - Delphi TPerlRegEx ReplaceAll 位于 2 个字之间

Delphi DLL 中的最终化代码

Delphi,无法使用外部 .pas 文件中的函数

Delphi 和单元中的最终确定

delphi - 配置MSBuild以调用XE2 dcc32.exe

delphi - 如何在 FM2 中从 TMediaPlayerControl 截屏?