Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop Ada-如何初始化包含文件类型成员的有限标记类型?_Oop_Inheritance_Syntax_Ada - Fatal编程技术网

Oop Ada-如何初始化包含文件类型成员的有限标记类型?

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

在下面的代码中,Mix_卡读卡器继承自Mix_IO_设备,后者是一个抽象标记记录

以前它包含一个
和两个
流访问
成员。我想修改代码,使其使用
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;