ADA:从异质列表中删除



我的分配需要创建一个包装的软件包,该软件包创建一个异质(使用继承(双链接列表。将节点插入列表很简单,但是当我必须找到一个包含某些信息的节点时,我的问题出现了。

PACKAGE AbstList IS
   TYPE AbstractList IS LIMITED PRIVATE;
   TYPE Node IS TAGGED PRIVATE;
   TYPE NodePtr IS ACCESS ALL Node'Class;
   PROCEDURE Init_Head(List: ACCESS AbstractList);
   PROCEDURE InsertFront(List: ACCESS AbstractList; Item: IN NodePtr; Success: OUT Boolean);
   PROCEDURE InsertRear(List: ACCESS AbstractList; Item: IN NodePtr; Success: OUT Boolean);
   FUNCTION ListSize(List: ACCESS AbstractList) RETURN Integer;
   -- The following are commented out as they are not complete in the package body
   --FUNCTION FindItem(List: ACCESS AbstractList; Value: NodePtr) RETURN NodePtr;
   --PROCEDURE Delete(List: ACCESS AbstractList; Item: NodePtr);   
   --PROCEDURE Print(List: ACCESS AbstractList);

   PRIVATE
   TYPE Node IS TAGGED RECORD
      Rlink, Llink: NodePtr;
   END RECORD;
   TYPE AbstractList IS LIMITED RECORD
      Count: Integer := 0;
      Head: NodePtr := NEW Node;
   END RECORD;
END AbstList;

我用来插入列表中的这样的记录是:

   TYPE CarName IS (GMC, Chevy, Ford, RAM);
   TYPE Car IS NEW AbstList.Node WITH RECORD 
      NumDoors: Integer;
      Manufacturer: CarName := GMC;   -- Default manu.
   END RECORD;

所以,例如,我如何在列表中找到包含指定的"制造商"的节点?有人建议我超载" ="操作员,尽管我不确定在拥有的东西的情况下这将如何工作。任何建议,将不胜感激。

根据手臂,相等性操作员是针对您的节点类型的非限制类型的预定剂。

如果您想要与默认值不同的行为(记录的所有成员的平等,请覆盖它。函数规范在同一页面中,只需使用您的 t 带有 node type(在这种情况下为 car (,然后写下您想要的

ADA 95理性第2部分第4章在4.3类宽类型和操作中说

预定义的平等运算符和成员资格测试被推广到全班类型。像其他预定义的操作一样,实现将取决于操作数的特定特定类型。但是,与正常的调度操作不同,如果操作数的标签不匹配,则不会提高约束。

对于平等,标签不匹配被视为不平等。只有标签匹配是调度,然后对特定于类型的相等性检查操作执行。这种方法允许程序可以安全地比较一个范围标记的类型的两个值,而无需先检查其标签是否匹配。如[rm83 4.5.2(12(]所述,这种平等检查中没有例外的事实与其他预定义的关系运算符一致。

因此,您希望能够说例如FindItem

   Current : Nodeptr := List.Head.Rlink;
begin
   ...
   if Value.all = Current.all then
      --  we’ve found a match

但是Car的预定义平等也包括Node组件LlinkRlink

所需的是一个平等操作,它仅比较Car组件。

您可以通过说

来覆盖预定义的平等
type Node is abstract tagged private;
function "=" (L, R : Node) return Boolean is abstract;

,然后

type Car is new Abstlist.Node with record
   Numdoors: Integer;
   Manufacturer: Carname := Gmc;
end record;
overriding
function "=" (L, R : Car) return Boolean is
  (L.Manufacturer = R.Manufacturer and then L.Numdoors = R.Numdoors);

(这是ADA 2012语法(。

最新更新