如何在Delphi中定义包含其他常量记录的常量记录?具体案例:使用向量的矩阵

6

假设我有一个简单的记录单元,例如:

TVector2D = record
public
  class function New(const x, y: Accuracy): TVector2D; static;
public
  x, y: Accuracy;
end;

接下来我有一个在同一单元中的第二个记录,它是使用上述记录集构建的,例如:

TMatrix3D = record
public
  class function New(const row1, row2, row3: TVector3D): TMatrix3D; static;
public
  Index : array [0..2] of TVector3D;
end;

我接下来将定义轴方向常数,如下所示:
//Unit vector constants
const
  iHat : TVector3D = (x: 1; y: 0; z: 0);
  jHat : TVector3D = (x: 0; y: 1; z: 0);
  kHat : TVector3D = (x: 0; y: 0; z: 1);

我现在希望使用上述常量来定义一个进一步的常量,例如:
  identity : TMatrix3D = (row1: iHat; row2: jHat; row3: kHat);

然而上述尝试并不起作用。我该怎么在Delphi XE2中实现这个呢?

非常感谢您的努力。:-)


这是一个可能重复的问题链接。 - Trojanian
我在第一条评论中链接了那个问题。不知道为什么它对你不起作用。是移动平台的问题吗? - Free Consulting
抱歉 - 是我的错。然而,尽管这些问题都针对类似的事情,我认为它们都应该保留。我搜索了答案,但没有找到,所以我提出了一个问题。将其保留在这里可以防止再次发生同样的情况。 - Trojanian
我认为这些问题本质上是相同的,只是措辞不同,甚至都得到了指向常量表达式概念(“真常量”)的答案。也许@RobKennedy有一天会注意到并使其中一个QQ的措辞更加正式,从而便于搜索。 - Free Consulting
正式的措辞不一定有利于搜索。 - Trojanian
显示剩余3条评论
1个回答

16

这是不可能的。在常量记录声明中,成员值必须是常量表达式。也就是说,您不能像您尝试做的那样使用已声明类型的常量。

文档这样说明,重点是我的强调:

记录常量

要声明记录常量,请在声明末尾的括号内指定每个字段的值-例如fieldName: value,并使用分号分隔字段赋值。 值必须由常量表达式表示。

所以您需要这样声明它:

const
  identity: TMatrix3D = (Index:
    ((x: 1; y: 0; z: 0),
     (x: 0; y: 1; z: 0),
     (x: 0; y: 0; z: 1))
    );

重复自己很令人沮丧,但我认为这是你能做的最好的。


@Z80不是关键字,它是TMatrix3D字段的名称。 - David Heffernan
自XE2以来已经有超过10个版本的更替,但是那些不变的记录仍然是一个蓝色的梦想,即使是C++现在也比Delphi更加舒适和易用。真不明白开发者在干嘛。 - Molochnik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接