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

2 つの問題: まず、APPLICATION 内で CONTAINER クラスをインスタンス化できますが、呼び出すときに

create container.make
container.addCritter(myCritter)

2 行目に前提条件の無効なインデックス違反エラーが表示されます。これは、配列の上限と下限を設定していないことが原因である可能性があります。ただし、そうしようとすると、構文エラーが発生します。この問題を解決する方法はどれですか?

次に、配列からオブジェクトを削除するために、インデックス値を取得できれば役立ちますが、何か不足していない限り、これを行う関数は見当たりません。

4

1 に答える 1

1

ARRAYs は通常、固定長のコンテナに使用されます。あなたの場合、多くの動的な変更があるため、より動的な構造を使用することをお勧めしますARRAYED_LIST. 同様にARRAY、インデックスでアイテムにアクセスする機能を提供しますが、より便利なものもあります。feature を使用して、新しい要素を追加できますextendprune特定の要素に一致する 1 つの要素のみを削除する必要があるprune_all場合、または一致するすべての要素を削除する必要がある場合は、 feature を使用して古い要素を削除できます。「一致」という言葉は、必要な比較基準に応じて、参照またはオブジェクトの等価性を表します:=または~. 比較基準は feature を使用して変更されますcompare_objects

いくつかの一般的な観察:

  • 要素の数を自分で追跡する必要はありません。通常、countこの数を提供する機能があります。
  • Eiffel のインデックスは通常、0 ではなく 1 から始まります。
  • が展開され、展開されたすべての型がアタッチメント マークに関係なくアタッチされるため、宣言detachable INTEGERは同等です。INTEGERINTEGER

次の議論も役に立つかもしれません: Eiffel でオブジェクトの配列を初期化する方法は?

于 2015-09-24T19:23:21.093 に答える