我的任务需要创建一个创建异构(使用继承)双向链表的包。将节点插入列表很简单,但是当我必须找到包含某些信息的节点时,我的问题就出现了。
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;
例如,我怎样才能在列表中找到包含指定“制造商”的节点?有人向我建议我重载“=”运算符,虽然我不知道这有什么用,因为我有。任何建议,将不胜感激。
答案 0 :(得分:2)
根据ARM,对于非限制类型预定义了相等运算符,这是您的节点类型的情况。
如果您想要一种与默认行为不同的行为(您的记录的所有成员相等,则只需覆盖它。 功能规范在同一页面中, T 与您的 Node 类型(在本例中为 Car )并写下您想要的内容
答案 1 :(得分:1)
{4}}在4.3类广泛类型和操作中说明
预定义的相等运算符和成员资格测试一般化以应用于类范围的类型。与此类型上的其他预定义操作一样,实现将取决于操作数的特定特定类型。但是,与正常的调度操作不同,如果操作数的标记不匹配,则不会引发Constraint_Error。
对于相等,标签不匹配被视为不等式。仅当标记匹配时才执行调度,然后执行特定于类型的相等性检查操作。这种方法允许程序安全地比较类范围标记类型的两个值是否相等,而不首先检查它们的标记是否匹配。如[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
组件Llink
,Rlink
。
所需要的是一个只比较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语法)。