Как инициализировать массив объектов в Eiffel?

Я пытаюсь реализовать решение проблемы производителя-потребителя с помощью Eiffel. У меня есть массив p класса PRODUCER и массив c класса CONSUMER, объявленный и инициализированный следующим образом:

    local
        p:attached ARRAY[PRODUCER]
        c:attached ARRAY[CONSUMER]
    do
        !!p.make(1,5)
        !!c.make(1,5)

Но когда я пытаюсь получить доступ к функции в одном из компонентов массива (например, p.at(i).somefeature()), он выдает исключение времени выполнения, говорящее «Вызов функции для пустой цели».

Любые идеи о том, как решить эту проблему? Это потому, что я не вызываю процедуру создания отдельных компонентов массива? Или есть основной недостаток в подходе к созданию массивов? Спасибо.

Я решил, что проблема возникает из-за того, что отдельные компоненты массивов (в данном случае производитель или потребитель), будучи ссылочным типом, инициализируются как void. Предлагаемое решение — использовать make_filled(default_value:T;low,high:INTEGER;), где T — сложный тип. Для строковых массивов дан пример: string_list:ARRAY[STRING] string_list.make_filled(" ",low,high), в результате чего каждый элемент string_list инициализируется строкой, являющейся пробелом. Любая помощь в том, как задать значение по умолчанию для класса PRODUCER? Спасибо

Кажется, я нашел решение проблемы. Мне просто нужно было создать экземпляр PRODUCER и CONSUMER и использовать их в значении по умолчанию в make_filled. Затем я могу манипулировать p[i] и c[i].

Это не очень эффективный способ, поэтому, если есть лучшее решение, поделитесь им. Спасибо.


person Divya    schedule 06.05.2011    source источник


Ответы (1)


{ARRAY}.make_filled обычно используется, когда все элементы массива должны быть одинаковыми. Если элементы разные, массив можно заполнить по одному:

create p.make_empty
p.force (create {PRODUCER}.make ("producer 1"), 1) -- Use appropriate code to
p.force (create {PRODUCER}.make ("producer 2"), 2) -- create PRODUCER objects.
...

Существует также несколько устаревший синтаксис для создания массивов, поэтому его следует использовать с осторожностью:

p := <<
    create {PRODUCER}.make ("producer 1"), -- Or some other code
    create {PRODUCER}.make ("producer 2")  -- to create producers.
>>
person Community    schedule 09.05.2011