Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 使用泛型创建链接列表_Delphi_Generics_Delphi 2010_Forward Declaration - Fatal编程技术网

Delphi 使用泛型创建链接列表

Delphi 使用泛型创建链接列表,delphi,generics,delphi-2010,forward-declaration,Delphi,Generics,Delphi 2010,Forward Declaration,我已经阅读了如何制作一个指向普通类的指针,并在类定义中使用它: type PExample = ^TExample; TExample = class data: Integer; next: PExample; end; 但是如何使用模板化参数呢?这不会在编译时在第二行出现错误未声明的标识符:“TExample”: type PExample = ^TExample; TExample<T> = class data: T; next:

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

type
  PExample = ^TExample;
  TExample = class
    data: Integer;
    next: PExample;
  end;
但是如何使用模板化参数呢?这不会在编译时在第二行出现错误
未声明的标识符:“TExample”

type
 PExample = ^TExample;
 TExample<T> = class
   data: T;
   next: PExample;
 end;
类型
PExample=^TExample;
TExample=class
资料:T;
下一步:举例;
结束;
改成

PExample = ^TExample<T>;
PExample=^TExample;

不修复它。

在使用类时,不需要使用示例。类已经是引用类型

 TExample<T> = class
   data: T;
   next: TExample<T>;
 end;
TExample=class
资料:T;
下一步:TExample;
结束;
这应该可以在不需要声明任何指针类型的情况下工作。指针类型仅在使用记录(值类型)时才是必需的

编辑:

令我惊讶的是,我刚刚注意到它在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.
程序项目;
{$APPTYPE控制台}
类型
TNode=记录
下一步:^T节点;
资料:T;
结束;
变量
节点1,节点2:TNode;
开始
Node1.Next:=@Node2;
节点1.数据:=1;
Node2.Next:=nil;
节点2.数据:=2;
WriteLn(Node1.Data);
WriteLn(Node1.Next.Data);
结束。
它仍然不能解决定义通用指针类型的问题,因为:

PNode<T> = ^TNode<T>;
PNode=^TNode;

不起作用。

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

type
 TExample<T> = class
   data: T;
   next: TExample<T>;
 end;
类型
TExample=class
资料:T;
下一步:TExample;
结束;

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

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

type
  PNode<T> = ^TNode<T>;
  TNode<T> = record
  public
    Next: PNode;
  end;
类型
PNode=^TNode;
TNode=记录
公众的
下一步:PNode;
结束;
不编译

也没有:

type
  TNode<T> = record
  type
    PNode = ^TNode;
  public
    Next: PNode;
  end;
类型
TNode=记录
类型
PNode=^TNode;
公众的
下一步:PNode;
结束;

我认为这是因为单过程编译器不支持方法的前向声明。对于操作符重载来说,这实际上是一个更实际的问题,因为类可以用于泛型链表。

<代码> ^示例/<代码>是一个双指针,它是指向对象实例指针的指针。您可以考虑制作一个通用的代码>这样你就不必在每个类中构建链表功能了,这是不正确的。在本例中,下一步是指向T的指针,而不是指向TNode的指针。。应该有一个数据:T;领域不幸的是,delphi编译器在尝试定义“P=^TNode;”时失败。显然,Delphi中的泛型还没有准备好做更多的事情,除了玩弄和惊叹它们的实现中仍然存在的漏洞之外。@Thorsten谢谢。今天我在公共场合学到了很多东西!!;-)我认为Delphi泛型就其本身而言是很好的,它们仍然非常有用。Delphi中泛型的局限性并不是泛型的基本局限性,它们只是一个从未正确完成的半成品实现的结果。我已经记录了相当多的针对泛型(和新RTTI)的QC,希望它们有一天能够真正完成,这样才有可能认真使用它们。@Thorsten就是这样。我正在区分泛型和模板。例如,我希望能够编写一个通用方法,
DoSomething(const a,b:T):T;开始结果:=a+b;结束这不能用Delphi中实现的泛型实现,但可以用模板实现。.net泛型可以做我想做的吗?@David,是的,.net支持你所描述的:我不同意你的上一句话,所以我暂时保留+1,因为指针对于其他类型来说是“必需的”,例如Integer、Double等简单类型。我无意说泛型指针通常是不需要的。不支持它们是Delphi通用支持的一个巨大漏洞。但在原始问题的上下文中,仅当您想使用记录时才需要问题指针。如果你使用类(已经是指针),它们不是必需的。那么简单的类型,比如整数呢?@jachgrate,你是什么意思?我已经说过,一般来说,应该添加泛型指针类型。但同样,这与最初的问题毫无关系。在原始问题中给出的示例中,提问者试图定义指向类的指针。在这种情况下,不需要指针,因为类已经是指针了(正如我的回答所述)。您可以使用记录定义相同类型的数据结构(单个链表)。在这种情况下,需要指针(如我的回答所述)。。。。。。你不能用“简单类型,比如整数”来定义单个链表,这就是为什么它们与我的答案毫无关系。