Как инициализировать массив объектов в Eiffel? - PullRequest
2 голосов
/ 06 мая 2011

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

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

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

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

Я понял, что проблема возникает из-за того, что отдельные компоненты массивов (в данном случае производитель или потребитель), будучи ссылочным типом, инициализируются как 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].

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

1 Ответ

2 голосов
/ 09 мая 2011

{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.
>>
...