Ada 的私有类型在实现中的可见性
Ada's private types visibility in implementation
私有类型在单元的实现中可见吗?例如,.ads:
package Unlimited_Strings is
type String_Block is private;
(...)
private
Max_Block_Size : constant Integer := 10;
subtype String_Size_Subtype is Integer range 0..Max_Block_Size;
type String_Block(Size : String_Size_Subtype := Max_Block_Size) is record
Next : Unlimited_String := null;
Str : String(1..Size) := (others => ' ');
end record;
和.adb:
Aux_Ptr := new String_Block(Max_Block_Size);
产生编译错误:"constraint no allowed when type has a constrained partial view"。
正如西蒙所说,我们这里需要一个复制器。我怀疑“.adb”文件并不是真正与您显示的 .ads 对应的文件。
请注意,由于您使用的是判别式的默认值,因此您实际上并未创建不受约束的类型。这意味着编译器将始终为 String_Block
(对应于 Max_Block_Size
)分配最大大小,即使您为 Size
指定了一个小得多的值。这可能不是您想要的(这是一个棘手的领域)。
另一方面,由于 String_Block
的 public 声明指定类型受限,因此您当然必须指定默认值。也许你的意思是:
type String_Block (<>) is private;
private
type String_Block (Size : String_Size_Subtype) is record ...
再次声明:据我们所知,您的代码是有效的,以上只是关于更好的内存使用的建议。
私有类型在单元的实现中可见吗?例如,.ads:
package Unlimited_Strings is
type String_Block is private;
(...)
private
Max_Block_Size : constant Integer := 10;
subtype String_Size_Subtype is Integer range 0..Max_Block_Size;
type String_Block(Size : String_Size_Subtype := Max_Block_Size) is record
Next : Unlimited_String := null;
Str : String(1..Size) := (others => ' ');
end record;
和.adb:
Aux_Ptr := new String_Block(Max_Block_Size);
产生编译错误:"constraint no allowed when type has a constrained partial view"。
正如西蒙所说,我们这里需要一个复制器。我怀疑“.adb”文件并不是真正与您显示的 .ads 对应的文件。
请注意,由于您使用的是判别式的默认值,因此您实际上并未创建不受约束的类型。这意味着编译器将始终为 String_Block
(对应于 Max_Block_Size
)分配最大大小,即使您为 Size
指定了一个小得多的值。这可能不是您想要的(这是一个棘手的领域)。
另一方面,由于 String_Block
的 public 声明指定类型受限,因此您当然必须指定默认值。也许你的意思是:
type String_Block (<>) is private;
private
type String_Block (Size : String_Size_Subtype) is record ...
再次声明:据我们所知,您的代码是有效的,以上只是关于更好的内存使用的建议。