如何在 Eiffel 的数组中添加和删除对象
How to add and remove objects from an array in Eiffel
我正在尝试制作一个 CONTAINER class 来维护一个 CRITTER 对象数组(我已经创建并测试过)。注意,有各种 CRITTER 亚种,它们继承自 CRITTER super class).目的是在此数组中添加和删除 CRITTER 对象。这是 CONTAINER class 的样子:
class
CONTAINER
create
make
feature
num: detachable INTEGER
list: ARRAY[CRITTER]
make
local
do
create list.make_empty
num := 0
end
addCritter(critter: CRITTER)
do
list.put(animal, num)
num := num + 1
end
removeCritter(critter: CRITTER)
do
list.put (list.at (num), ???) -- put last element in position of element to be removed
list.remove_tail (num) -- remove tail
num := num - 1
end
end
两个问题:
首先,我可以在 APPLICATION 中实例化 CONTAINER class,但是当我调用
create container.make
container.addCritter(myCritter)
我在第二行收到先决条件无效索引违规错误。这可能是因为我没有设置数组的上下界。但是,当我尝试这样做时,出现语法错误。解决这个问题的方法是什么?
其次,为了从数组中删除一个对象,如果我能得到索引值会有所帮助,但我看不到任何执行此操作的函数,除非我遗漏了什么。
ARRAY
通常用于固定长度的容器。在你的情况下,有很多动态变化,最好使用更多的动态结构,例如 ARRAYED_LIST
。类似于 ARRAY
它提供了通过索引访问项目的功能,但也有更方便的功能。可以使用功能 extend
添加新元素。如果只需要删除与给定元素匹配的一个元素,则可以使用功能 prune
删除旧元素,如果需要删除所有匹配元素,则可以使用 prune_all
功能删除旧元素。单词 "matching" 表示引用或对象相等,具体取决于所需的比较标准:=
或 ~
。使用特征 compare_objects
.
更改比较标准
一些一般性观察:
- 不需要自己跟踪元素的数量,通常有一个功能
count
可以提供这个数量。
- Eiffel 中的索引通常以 1 开头,而不是 0。
- 声明
detachable INTEGER
等同于 INTEGER
,因为 INTEGER
被扩展并且所有扩展类型都被附加,而不考虑任何附加标记。
以下讨论也可能有用:
How to initialise an array of objects in Eiffel?
我正在尝试制作一个 CONTAINER class 来维护一个 CRITTER 对象数组(我已经创建并测试过)。注意,有各种 CRITTER 亚种,它们继承自 CRITTER super class).目的是在此数组中添加和删除 CRITTER 对象。这是 CONTAINER class 的样子:
class
CONTAINER
create
make
feature
num: detachable INTEGER
list: ARRAY[CRITTER]
make
local
do
create list.make_empty
num := 0
end
addCritter(critter: CRITTER)
do
list.put(animal, num)
num := num + 1
end
removeCritter(critter: CRITTER)
do
list.put (list.at (num), ???) -- put last element in position of element to be removed
list.remove_tail (num) -- remove tail
num := num - 1
end
end
两个问题: 首先,我可以在 APPLICATION 中实例化 CONTAINER class,但是当我调用
create container.make
container.addCritter(myCritter)
我在第二行收到先决条件无效索引违规错误。这可能是因为我没有设置数组的上下界。但是,当我尝试这样做时,出现语法错误。解决这个问题的方法是什么?
其次,为了从数组中删除一个对象,如果我能得到索引值会有所帮助,但我看不到任何执行此操作的函数,除非我遗漏了什么。
ARRAY
通常用于固定长度的容器。在你的情况下,有很多动态变化,最好使用更多的动态结构,例如 ARRAYED_LIST
。类似于 ARRAY
它提供了通过索引访问项目的功能,但也有更方便的功能。可以使用功能 extend
添加新元素。如果只需要删除与给定元素匹配的一个元素,则可以使用功能 prune
删除旧元素,如果需要删除所有匹配元素,则可以使用 prune_all
功能删除旧元素。单词 "matching" 表示引用或对象相等,具体取决于所需的比较标准:=
或 ~
。使用特征 compare_objects
.
一些一般性观察:
- 不需要自己跟踪元素的数量,通常有一个功能
count
可以提供这个数量。 - Eiffel 中的索引通常以 1 开头,而不是 0。
- 声明
detachable INTEGER
等同于INTEGER
,因为INTEGER
被扩展并且所有扩展类型都被附加,而不考虑任何附加标记。
以下讨论也可能有用: How to initialise an array of objects in Eiffel?