0

Eiffel でlinked_listのイテレータを作成しようとしています。

次のエラーが表示されます:変数が正しく設定されていません。

Class: ITERATOR_ON_COLLECTION [E]
Feature: make
Attribute(s): {ITERATOR}.target
Line: 30

ボイドセーフティが原因であることはわかっていますが、修正方法がわかりません。(void safe を True に設定し、プリコンパイル済みライブラリを safe バージョンに変更して clean_compile しました。)

以下はクラスです。

class
    ITERATOR_ON_COLLECTION [E]

inherit
    ITERATOR [E]

create
    make

feature {NONE} -- Attributes

    collection: LINKED_LIST[E]
    item_index: INTEGER

feature -- initialization

    make(c: LINKED_LIST [E])
        require
            --c /= void
        do
            --  create {COLLECTION} collection.make
            --  create collection.make -- it doesnt work with/without this line 
            collection := c
            item_index := 1
        end

    start
        do
            item_index := 1
        end

    item: STRING
        do
            Result := "hello"
        end

    next
        do
            item_index := item_index + 1
        end

    is_off: BOOLEAN
        do
            Result := True
        end


    do_until (action: PROCEDURE [E]; test: FUNCTION [E, BOOLEAN])
            -- Apply `action' to every item of `target' up to
            -- and including first one satisfying `test'.
            -- (Apply to full list if no item satisfies `test').
        require else
            action_exists: action /= Void
            test_exists: test /= Void
        do
        end

    do_while (action: PROCEDURE [E]; test: FUNCTION [E, BOOLEAN])
            -- Apply `action' to every item of `target' up to
            -- and including first one not satisfying `test'.
            -- (Apply to full list if all items satisfy `test').
        require else
            action_exists: action /= Void
            test_exists: test /= Void
        do
        end

    until_do (action: PROCEDURE [E]; test: FUNCTION [E, BOOLEAN])
            -- Apply `action' to every item of `target' up to
            -- but excluding first one satisfying `test'.
            -- (Apply to full list if no items satisfy `test'.)
        require else
            action_exists: action /= Void
            test_exists: test /= Void
        do
        end

    while_do (action: PROCEDURE [E]; test: FUNCTION [E, BOOLEAN])
            -- Apply `action' to every item of `target' up to
            -- but excluding first one satisfying not `test'.
            -- (Apply to full list if all items satisfy `test'.)
        require else
            action_exists: action /= Void
            test_exists: test /= Void
        do
        end

    there_exists (test: FUNCTION [E, BOOLEAN]): BOOLEAN
            -- Is `test' true for at least one item of `target'?
        require else
            test_exists: test /= Void
        do
        end

    for_all (test: FUNCTION [E, BOOLEAN]): BOOLEAN
            -- Is `test' true for all items of `target'?
        require else
            test_exists: test /= Void
        do
        end

end
4

1 に答える 1

1

クラスを見ないITERATORと、本当の原因が何かを判断するのは困難です。これが私の推測です。

クラスは、添付型ITERATORの属性を宣言します。target作成手順で属性を設定する必要があります。collectionほとんどの場合、クラス内の属性を破棄してtarget代わりに使用する必要があります。属性のタイプによっては、クラスで再定義する必要がある場合とそうでない場合があります。

取り組みに関しては、クラスの void-safe バージョンから最初から開始する方がよいでしょう。また、void-safe ではない設定から void-safe の設定に切り替えるときは、クラス タイプがデフォルト (プロジェクト設定ダイアログで「デフォルトで型がアタッチされていますか?」という構成オプションを探します)。このオプションはTrueに設定する必要があります(これは 16.11 より前の EiffelStudio では自動的には行われません)。

コードの他の部分に関するいくつかのコメント:

  • 引数の型がアタッチされている場合、フォームにチェックのポイントはありませんarg /= Void

  • 親クラスの機能に前提条件fooが指定されている場合、次のように繰り返す必要はありません

    require else
        foo
    

    安全に取り外すことができます。(フィーチャ フラット (またはフラット ショート) フォームを見て、親の前提条件がまだそこにあることを確認できます。)

  • 再定義された機能のコメントが変更されていない場合、それらは次のように置き換えることができます

    -- <Precursor>
    

    このようにして、親のバージョンの変更は自動的に再宣言に反映されます (再びフラット フォームを見てください)。

于 2016-07-13T04:29:00.093 に答える