Как добавлять и удалять объекты из массива в 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

Две проблемы: во-первых, я могу создать экземпляр класса CONTAINER внутри APPLICATION, но когда я вызываю

create container.make
container.addCritter(myCritter)

Я получаю предварительное условие, ошибка нарушения недопустимого индекса во второй строке. Это может быть потому, что я не установил верхнюю и нижнюю границы массива. Однако, когда я пытаюсь это сделать, я получаю синтаксические ошибки. Как решить эту проблему?

Во-вторых, чтобы удалить объект из массива, было бы полезно, если бы я мог получить значение индекса, но я не вижу никакой функции, которая это делает, если только я что-то не упустил.


person cadebe    schedule 24.09.2015    source источник


Ответы (1)


ARRAYs обычно используются для контейнеров фиксированной длины. В вашем случае при большом количестве динамических изменений лучше использовать более динамичные структуры, например, ARRAYED_LIST. Подобно ARRAY предоставляет возможности доступа к элементам по их индексу, но есть и более удобные. Новые элементы можно добавлять с помощью функции extend. Старые элементы можно удалить с помощью функции prune, если нужно удалить только один элемент, соответствующий заданному, или prune_all, если необходимо удалить все соответствующие элементы. Слово «совпадение» означает либо ссылочное, либо объектное равенство, в зависимости от того, какие критерии сравнения требуются: = или ~. Критерий сравнения изменяется с помощью функции compare_objects.

Некоторые общие наблюдения:

  • Нет необходимости отслеживать количество элементов самостоятельно, обычно есть функция count, которая предоставляет это количество.
  • Индексы в Eiffel обычно начинаются с 1, а не с 0.
  • Объявление detachable INTEGER эквивалентно INTEGER, потому что INTEGER расширяется, и все расширенные типы присоединяются независимо от любых меток присоединения.

Также может быть полезно следующее обсуждение: Как инициализировать массив объекты в Эйфеле?

person Alexander Kogtenkov    schedule 24.09.2015