在其他类中使用类/记录(在此上下文中需要的子类型标记)

时间:2014-04-21 00:14:44

标签: class oop record ada subtype

我想学习ADA并且在课堂上遇到问题'

我有2个A和B类,希望A类可以使用B类。 A类

with B;
package A is
   type A is tagged
      record
         varA : INTEGER := 0;
         varB : INTEGER := 0;
      end record;
   procedure DOSMTH(A_In : in out A; B_IN: in out B);

end A;

和B类

package B is
   type B is tagged
      record
         var1 : INTEGER;
         var2 : INTEGER;
      end record;
      procedure DoSMTH2(B_IN: in out B; var  : INTEGER);
end B;

如果我想编译A,我收到以下错误消息:

  

此上下文中要求的子类型标记
  发现' B'在b.ads:1

宣布

另一个问题是我的主要'不能使用A和B(声明)

的文件
with Ada.Text_IO, A, B;
procedure Main is
   a : A;
   b : B;
begin
 null;  
end Main;

我得到以下错误:

  

对象" A"在声明结束前不能使用   对象" B"在声明结束之前不能使用

我找不到任何解决方案。我已阅读ADA 2005参考手册但无法找到任何内容。

好的thx寻求帮助, 最终它现在有效。

解决方案:

将A类修改为

 with B;
    package A is
       type A is tagged
          record
             -- u can use  a object VAR with
             -- objB : B.B
             varA : INTEGER := 0;
             varB : INTEGER := 0;
          end record;
       procedure DOSMTH(A_In : in out A; B_IN: in out B.B);

    end A

将Main修改为:

with Ada.Text_IO, A, B;
procedure Main is
   myA : A.A; --the old one was stupid ...
   myB : B.B; --same here
begin
 null;  
end Main;

3 个答案:

答案 0 :(得分:4)

主程序的问题是Ada不区分大小写,所以当你说

a : A.A;

编译器看到a : A并认为第二个A与第一个A相同,因此投诉object "A" cannot be used before end of its declaration

您可以通过限定来告诉编译器在哪里查找包A。软件包A在库级声明,并且有一个名义包Standard可用于表明:

a : Standard.A.A;

但是,如果可以的话,最好避免在不同的事情上使用相同的名称。

答案 1 :(得分:1)

您只在包A中使用了包B - 为了使用任何形式,您必须使用限定名称(即:对于记录B,您应该使用B.B)。喜欢: with B; package A is type A is tagged record varA : INTEGER := 0; varB : INTEGER := 0; end record; procedure DOSMTH(A_In : in out A; B_IN: in out B.B); end A;

如果您想使用包B中声明的内容而没有完全符合条件的名称,您应该在使用use B;之后立即使用它。

关于是否应该使用或仅使用包是一个难题 - 大多数时候我认识的大多数Ada程序员(包括我自己)更喜欢只使用包,很少使用它们 - 例如在使用Lumen库时(OpenGL)与glut-like功能绑定)我通常使用Lumen因为那时我可以输入GL.Whatever_GL_Function而不是Lumen.GL.Whatever_GL_Function(但我没有"使用" Lumen.GL)。如果包名称很长,我更喜欢在过程中重命名它,如果是类型(对于运算符,如果已定义),可以use type B.B;

PS:如果有些部分不清楚,我可以详细说明。

答案 2 :(得分:-1)

我的猜测是编译器将“B”视为包的名称而不是记录。尝试以不同方式命名您的包或记录。

此外,如果您想学习Ada,参考手册是您想要开始的最后一个地方。获得巴恩斯的书或获得亚马逊使用的旧书之一。你在二手的部分得到了关于Ada 95 5美元的好书。