1

我正在尝试创建一个维护 CRITTER 对象数组的 CONTAINER 类(我已经创建并测试了它。请注意,有各种 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)

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

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

4

1 回答 1

1

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

一些一般性意见:

  • 不需要自己跟踪元素的数量,通常有一个功能count可以提供这个数量。
  • 埃菲尔的索引通常以 1 开头,而不是 0。
  • 该声明detachable INTEGER等效于INTEGER因为INTEGER被扩展,并且所有扩展类型都被附加,而不管任何附加标记。

以下讨论也可能有用: 如何在 Eiffel 中初始化对象数组?

于 2015-09-24T19:23:21.093 回答