gpt4 book ai didi

oop - 为什么对象的类型是指向标记类型的指针,而不是标记类型?

转载 作者:行者123 更新时间:2023-12-02 08:32:21 24 4
gpt4 key购买 nike

我有 3 个文件:other.ads、other.adb 和 test.adb。

其他广告:

package Other is
type Thing is tagged record
Stuff : String(1..4);
end record;
procedure Say (T : in Thing);
end Other;

other.adb:为简洁起见未显示,示例也不是必需的。

测试.adb:

with Other;

procedure Test is
T : Other.Thing := new Other.Thing;
begin
T.Stuff := "test";
T.Say;
end Test;

我收到这个错误:

test.adb:4:23: expected type "Thing" defined at other.ads:2
test.adb:4:23: found type access to "Thing" defined at line 4

如果我有这些文件:

其他广告:

package Other is
type Thing is tagged record
Stuff : String(1..4);
end record;
type Ref is access all Thing;
procedure Say (T : in Thing);
end Other;

测试.adb:

with Other;

procedure Test is
T : Other.Ref := new Other.Thing;
begin
T.Stuff := "test";
T.Say;
end Test;

然后它编译并运行良好。

为什么我不能将 new Other.Thing 指定为 Other.Thing 类型?

最佳答案

如果您在 Java 中声明一个变量,您设置它的方式取决于该变量的类型是否为原始类型。 int foo 为整数保留空间。另一方面,Thing foo 为指向 Thing 的引用(指针)保留空间,您使用 new事物本身; Thing foo = new Thing

Ada 不是这样的(就此而言,C 或 C++ 也不是);当你说 Foo : Thing 时,编译器会为 Thing 保留空间(可能在堆栈上)。所以你的第一个例子可以只读

   T : Other.Thing;
begin
T.Stuff := “test”;

当您在 Ada 中使用 new 关键字时,您出于某种原因需要一个访问值,正如您在第二个示例中强制使用的那样;您已将 T 声明为 Ref,它被声明为 access all Thing

请注意,在您的第二个示例中,当您说

   T.Stuff := “test”;

这实际上是

   T.all.Stuff := “test”;

有些人喜欢将 .all 显式放入。

关于oop - 为什么对象的类型是指向标记类型的指针,而不是标记类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25343342/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com