Oop Ada-如何初始化包含文件类型成员的有限标记类型?
在下面的代码中,Mix_卡读卡器继承自Mix_IO_设备,后者是一个抽象标记记录 以前它包含一个Oop Ada-如何初始化包含文件类型成员的有限标记类型?,oop,inheritance,syntax,ada,Oop,Inheritance,Syntax,Ada,在下面的代码中,Mix_卡读卡器继承自Mix_IO_设备,后者是一个抽象标记记录 以前它包含一个正和两个流访问成员。我想修改代码,使其使用File\u Type成员 原因是,我希望这种类型的每个实例都能够在需要时打开和关闭其文件,或者在需要时根本不打开和关闭 问题是我无法初始化此继承类型,因为File\u type是有限类型。如何编写我的Create\u Mix\u Card\u Reader函数以允许此操作 .广告 .亚洲开发银行 GNAT抱怨我不能将null,null传递到File\u Ty
正
和两个流访问
成员。我想修改代码,使其使用File\u Type
成员
原因是,我希望这种类型的每个实例都能够在需要时打开和关闭其文件,或者在需要时根本不打开和关闭
问题是我无法初始化此继承类型,因为File\u type
是有限类型。如何编写我的Create\u Mix\u Card\u Reader
函数以允许此操作
.广告
.亚洲开发银行
GNAT抱怨我不能将null,null
传递到File\u Type
成员对中,因为它们不兼容。当然,null是过去使用Stream\u访问
成员时留下的。似乎我必须在这里传递一些东西,但我不想为了安抚编译器而过早地打开文件
怎么办
编辑:
我有几个明显的选择:
- 改用
(但我仍然需要在其他地方保持文件的打开/关闭)access File\u Type
- 将所有文件类型的对象分别存储在一个数组中,并像以前一样使用流引用它们,但这看起来很混乱
- 这应该可以做到:
function Create_Mix_Card_Reader return Mix_IO_Device_Access is
Ret : Mix_IO_Device_Access := new Mix_Card_Reader'(
16, Input_Type => <>, Ouptut_Type => <>);
begin
return Ret;
end Create_Mix_Card_Reader;
函数创建\u混合\u卡\u读卡器返回混合\u IO\u设备\u访问被禁用
Ret:Mix\u IO\u设备\u访问:=新的Mix\u卡\u读卡器(
16,输入类型=>,输出类型=>);
开始
返回Ret;
最终创建混合卡读卡器;
框表示法是默认值的占位符。您至少需要Ada 2005才能在聚合中使用它,并且不能使用位置符号,详细信息将在中解释。如果需要,您可以将这两个赋值缩短为
others=>
。您实际上不需要初始化文件类型
变量,因为它们开始时已初始化(但未打开)
我得到的印象是你一开始没有使用访问类型?尝试以下方法(不是对所提出问题的回答,但可能仍然有用):
我不是100%确定这里的确切合法性,但我认为这是“初始化到位”:
正如您所看到的,它编译(并运行!)正常
好漂亮!我没想到这是可能的。谢天谢地,我正在使用2012。它就像一个魔咒,比我那丑陋的黑客更容易理解。非常感谢+1.
function Create_Mix_Card_Reader return Mix_IO_Device_Access is
Ret : Mix_IO_Device_Access := new Mix_Card_Reader'(16, null, null);
begin
return Ret;
end Create_Mix_Card_Reader;
function Create_Mix_Card_Reader return Mix_IO_Device_Access is
Ret : Mix_IO_Device_Access := new Mix_Card_Reader'(
16, Input_Type => <>, Ouptut_Type => <>);
begin
return Ret;
end Create_Mix_Card_Reader;
with Ada.Text_IO; use Ada.Text_IO;
package Wossname is
type Mix_IO_Device is abstract tagged limited
record
Block_Size : Positive;
Input_File : File_Type;
Output_File : File_Type;
end record;
type Mix_Card_Reader is new Mix_IO_Device with null record;
function Create_Mix_Card_Reader return Mix_IO_Device'Class;
end Wossname;
package body Wossname is
function Create_Mix_Card_Reader return Mix_IO_Device'Class is
begin
return Ret : Mix_Card_Reader do
Ret.Block_Size := 16;
end return;
end Create_Mix_Card_Reader;
end Wossname;
procedure Wossname.Test is
Reader : Mix_IO_Device'Class := Create_Mix_Card_Reader;
begin
begin
Create (Reader.Output_File, Name => "wossname.out", Mode => Out_File);
exception
when Use_Error =>
Open (Reader.Output_File, Name => "wossname.out", Mode => Out_File);
end;
Put (Reader.Output_File, "hi!");
Close (Reader.Output_File);
end Wossname.Test;