如何在Eiffel中初始化一个对象数组?

时间:2011-05-06 18:19:41

标签: eiffel

我正在尝试使用Eiffel实现Producer-Consumer问题的解决方案。我有一个类PRODUCER的数组p和一个类CONSUMER的数组c声明并初始化如下:

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

但是当我尝试访问数组的某个组件中的某个功能(如p.at(i).somefeature())时,它会给出一个运行时异常,说“在void target上调用功能”。

关于如何解决这个问题的任何想法?是因为我没有为数组的各个组件调用创建过程吗?或者是否存在创建阵列的方法的基本缺陷?感谢。

我认为问题出现是因为作为引用类型的数组的单个组件(在本例中是生产者或使用者)被初始化为void。建议的解决方案是使用make_filled(default_value:T; low,high:INTEGER;),其中T是复杂类型。给出了字符串数组的一个例子                     string_list:ARRAY [字符串]                     string_list.make_filled(“”,low,high) 使string_list的每个元素初始化为一个空格的字符串。有关如何为类PRODUCER提供默认值的任何帮助?感谢

我想我找到了问题的解决方案。我只需要创建一个PRODUCER和CONSUMER的实例,并使用make_filled中的默认值。然后我可以操纵p [i]和c [i]。

这不是一种超级有效的方法,所以如果有更好的解决方案,请分享。感谢。

1 个答案:

答案 0 :(得分:2)

当数组的所有元素应该相同时,通常使用

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