使用泛型制作链表

时间:2011-03-18 01:46:59

标签: delphi generics delphi-2010 forward-declaration

我已经阅读了如何创建指向普通类的指针并在类difinition中使用它:

type
  PExample = ^TExample;
  TExample = class
    data: Integer;
    next: PExample;
  end;

但你怎么用模板化参数做到这一点?这不会在第二行使用错误Undeclared identifier: 'TExample'进行编译:

type
 PExample = ^TExample;
 TExample<T> = class
   data: T;
   next: PExample;
 end;

将其更改为

PExample = ^TExample<T>;

无法修复它。

3 个答案:

答案 0 :(得分:4)

在使用类时,您不需要使用PExample。类已经是引用类型。

 TExample<T> = class
   data: T;
   next: TExample<T>;
 end;

这应该可以在不需要声明任何指针类型的情况下工作。只有在使用记录(值类型)时才需要指针类型。

编辑:

令我惊讶的是,我注意到这个编译并在Delphi XE中工作:

program Project;

{$APPTYPE CONSOLE}

type
  TNode<T> = record
    Next: ^TNode<T>;
    Data: T;
  end;

var
  Node1, Node2: TNode<Integer>;

begin
  Node1.Next := @Node2;
  Node1.Data := 1;
  Node2.Next := nil;
  Node2.Data := 2;

  WriteLn(Node1.Data);
  WriteLn(Node1.Next.Data);
end.

它仍然无法解决定义通用通用指针类型的问题,因为:

PNode<T> = ^TNode<T>;

不起作用。

答案 1 :(得分:2)

其他答案告诉您如何构建通用的链接列表。如果您需要构建通用的链接记录列表,则目前无法执行此操作:

type
  PNode<T> = ^TNode<T>;
  TNode<T> = record
  public
    Next: PNode;
  end;

无法编译。

也不是:

type
  TNode<T> = record
  type
    PNode = ^TNode;
  public
    Next: PNode;
  end;

我认为原因是单通道编译器不支持方法的前向声明。对于运算符重载而言,这实际上是一个比泛型更实际的问题,因为类可以用于通用链表。

答案 2 :(得分:1)

是否需要使用指向类的指针?使用“下一个”字段的类引用应该可以正常工作,如下所示:

type
 TExample<T> = class
   data: T;
   next: TExample<T>;
 end;

“next”字段仍可以是NIL,也可以分配另一个TExample实例。这似乎否定了使用传统^指针的需要(尽管您可能认为对类的引用也是指针,只是使用不同的语法)。