我已经阅读了如何创建指向普通类的指针并在类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>;
无法修复它。
答案 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实例。这似乎否定了使用传统^指针的需要(尽管您可能认为对类的引用也是指针,只是使用不同的语法)。