假设我有两个记录:人和动物。每个记录都放在单独的程序包中。

打包人员:

with animals;
use animals;

package persons is

    type person is record
     ...
     animalref: animalPOINTER;
     ...
    end record;

    type personPOINTER is access person;

end persons;

包装动物:
with persons;
use persons;

package animals is
    type animal is record
     ...
     ownerref:  personPOINTER;
     ...
    end record;

    type animalPOINTER is access animal;

end animals;

我这里有循环单元依赖性,并且编译器会产生致命错误。

有没有人有解决这种问题的模式?

谢谢!

最佳答案

您需要limited with,它是为解决此问题而引入的。参见Rationale for Ada 2005, section 4.2
AnimalsPersons是对称的(我的编辑器已经调整了布局和大小写;我为每个添加了一个记录组件,因此下面的演示程序可以打印一些内容):

limited with Animals;
package Persons is

   --  One of the few things you can do with an incomplete type, which
   --  is what Animals.Animal is in the limited view of Animals, is to
   --  declare an access to it.
   type AnimalPOINTER is access Animals.Animal;

   type Person is record
      Name : Character;
      Animalref : AnimalPOINTER;
   end record;

end Persons;

limited with Persons;
package Animals is

   type PersonPOINTER is access Persons.Person;

   type Animal is record
      Name : Character;
      Ownerref : PersonPOINTER;
   end record;

end Animals;

该演示程序具有AnimalsPersons的完整 View 。这个例子很笨拙。通过将子程序添加到AnimalsPersons中,您也许可以更好地组织事情。请注意,如果Animals的主体需要使用with Persons;中的任何内容,则可以(并且必须)是Persons
with Ada.Text_IO; use Ada.Text_IO;
with Animals;
with Persons;
procedure Animals_And_Persons is
   A : Persons.animalPOINTER := new Animals.Animal;
   P : Animals.PersonPOINTER := new Persons.Person;
begin
   A.all := (Name => 'a', Ownerref => P);
   P.all := (Name => 'p', Animalref => A);
   Put_Line (P.Name & " owns " & P.Animalref.Name);
   Put_Line (A.Name & " is owned by " & A.Ownerref.Name);
end Animals_And_Persons;

当编译和运行时,
$ ./animals_and_persons
p owns a
a is owned by p

关于艾达:如何解决 "Circular Unit Dependency"?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34694211/

10-15 16:30