如何在Eiffel

时间:2015-09-24 16:44:55

标签: arrays eiffel

我正在尝试创建一个CONTAINER类,它维护一个CRITTER对象数组(我已经创建并测试过了。注意,有各种CRITTER亚种,它们继承自CRITTER超类)。目的是在此数组中添加和删除CRITTER对象。这就是CONTAINER类的样子:

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类,但是当我调用

create container.make
container.addCritter(myCritter)

我得到一个先决条件,第二行无效索引违规错误。这可能是因为我没有设置数组的上限和下限。但是,当我尝试这样做时,我会遇到语法错误。哪种方法可以解决这个问题?

其次,为了从数组中删除一个对象,如果我能掌握索引值会有所帮助,但我看不到任何这样做的函数,除非我遗漏了什么。

1 个答案:

答案 0 :(得分:1)

ARRAY通常用于固定长度的容器。在您的情况下,通过大量动态更改,最好使用更多动态结构,例如ARRAYED_LIST。与ARRAY类似,它提供了按索引访问项目的功能,但也有更方便的功能。可以使用功能extend添加新元素。如果只需要删除与给定元素匹配的一个元素,则可以使用要素prune删除旧元素,如果需要删除所有匹配元素,则可以使用prune_all。 “匹配”一词表示引用或对象相等,具体取决于所需的比较标准:=~。使用功能compare_objects更改比较条件。

一些一般性意见:

  • 您无需自行跟踪元素数量,通常会有一个提供此数字的功能count
  • Eiffel中的索引通常以1开头,而不是0。
  • 声明detachable INTEGER相当于INTEGER,因为INTEGER已展开,所有展开的类型都会附加,而不管任何附件标记。

以下讨论也可能有用:   How to initialise an array of objects in Eiffel?