Ada:如何解决"Circular Unit Dependency"?
Ada: how to solve "Circular Unit Dependency"?
假设我有两条记录:人物和动物。每条记录都在一个单独的包中。
包裹人数:
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.
Animals
和 Persons
是对称的(我的编辑器调整了布局和大小写;我为每个添加了一个记录组件,因此下面的演示程序可以打印一些东西):
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;
演示程序有Animals
和Persons
的全貌。这个例子很笨拙;您可以通过向 Animals
和 Persons
添加子程序来更好地组织事情。请注意,Animals
的 body 可以(并且必须)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
假设我有两条记录:人物和动物。每条记录都在一个单独的包中。
包裹人数:
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.
Animals
和 Persons
是对称的(我的编辑器调整了布局和大小写;我为每个添加了一个记录组件,因此下面的演示程序可以打印一些东西):
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;
演示程序有Animals
和Persons
的全貌。这个例子很笨拙;您可以通过向 Animals
和 Persons
添加子程序来更好地组织事情。请注意,Animals
的 body 可以(并且必须)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