【问题标题】:Making a linked-list with generics使用泛型制作链表
【发布时间】:2011-03-18 01:46:59
【问题描述】:

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

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>;

没有修复它。

【问题讨论】:

  • ^TExample&lt;T&gt; 是一个双指针,它是一个指向对象实例的指针。
  • 您可以考虑制作一个通用的LinkedList 类,这样您就不必在每个类中都构建链表功能。

标签: delphi generics delphi-2010 forward-declaration


【解决方案1】:

当您使用类时,您不需要使用 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,因为指针对于其他类型是“必需的”,例如,简单类型,如 Integer、Double 等。
  • 我并不是想说泛型指针通常不是必需的。不支持它们是 Delphi 通用支持中的一个巨大漏洞。但是在原始问题的上下文中只有在您想使用记录时才需要指针。如果您使用类(已经是指针),则不需要它们。
  • 简单类型呢,比如整数?
  • @jachguate,你是什么意思?我已经说过,一般来说,泛型指针类型肯定应该被添加。但同样,这与原始问题完全无关。在原始问题中给出的示例中,提问者试图定义一个指向类的指针。 在这种情况下,不需要指针,因为类已经是指针(如我的回答所述)。您可以使用记录定义相同类型的数据结构(单个链表)。在这种情况下,将需要指针(如我的回答所述)......
  • ...您可以使用“简单类型,如整数”定义单个链表,这就是为什么它们完全没有任何关系我的回答。
【解决方案2】:

其他答案告诉您如何构建类的通用链表。如果您需要构建一个通用的记录链表,目前您无法这样做:

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

不编译。

也没有:

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

我相信这是因为单程编译器不支持方法的前向声明。这实际上是运算符重载比泛型更实际的问题,因为类可以用于泛型链表。

【讨论】:

  • 这是不正确的。在这种情况下,Next 是指向 T 的指针,而不是指向 TNode 的指针,因为它需要......并且应该有一个 Data: T;场地。不幸的是,delphi 编译器在尝试定义“P = ^TNode;”时失败。很明显,Delphi 中的泛型还没有准备好,除了玩弄并惊叹于它们的实现中仍然存在的所有漏洞之外。
  • @Thorsten 谢谢。我今天在公共场合学习了很多!! ;-) 我认为 Delphi 泛型就其本身而言很好,它们仍然非常有用。他们只是没有模板的灵活性。
  • Delphi 中泛型的限制并不是泛型的基本限制,它们只是半生不熟的实现的结果,该实现从未正确完成。我记录了大量针对仿制药(和新的 RTTI)的 QC,希望它们有朝一日真正完成,以至于实际上可以认真使用它们。
  • @Thorsten 是这样的。我正在区分泛型和模板。例如,我希望能够编写一个泛型方法DoSomething(const a, b: T): T; begin Result := a+b; end;,这不能用 Delphi 中实现的泛型来完成,但可以用模板来完成。 .net 泛型可以做我想做的事吗?
  • @David,是的,.NET 支持您所描述的内容:msdn.microsoft.com/en-us/library/ms172192.aspx#Y200
【解决方案3】:

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

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

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

【讨论】:

    猜你喜欢
    • 2012-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多