2

私は次のコンポーネントベースのアーキテクチャを持っています。特定のコンポーネントの更新機能内から、コンポーネントを更新しているマネージャーのループから抜け出すにはどうすればよいですか?

成分

class Component
{
    virtual void Update() = 0;
};

マネジャー

class Manager
{
    vector<Component*> List;
    void Add(Component* cpnt)
    {
        List.push_back(cpnt);
    }
    void Loop()
    {
        while(1)
        {
            for (auto i = List.begin(); i != List.end(); i++)
                i->Update();
        }
    }
};

class Example : public Component
{
    void Update()
    {
        // want to break out of mgr's while loop from here
    }
};

int main()
{
    Manager mgr;
    mgr.Add(new Example());
    mrg.Loop();
}

(この例では、簡単にするためにアクセサーを無視していることに注意してください。)

4

4 に答える 4

3

の戻り値に応じて、ループUpdateの外で例外をスローしてキャッチするか、ループから例外をキャッチすることができます。breakUpdate

どちらを選択するかは、ロジックによって異なります。ループの中断が論理エラーの結果である場合は、例外を使用してください。

ロジックの一部である場合は、リターンを使用します。

于 2012-11-11T18:06:36.037 に答える
1

Updateループを続行したくない場合に基づいて、戻り値を作成できます。

例外を使用することもできます。

于 2012-11-11T18:06:12.363 に答える
1

Update()停止するかどうかを示すコードを返し、ループ内で確認しますManager。または、例外をスローします。これは、よりC++似たものであり、発生することがあまり頻繁に発生しない場合です。

つまり、次のループを使用して、または同様に変更virtual void Update()します。virtual bool Update()Manager

bool ok = true;
while(ok)
    for (auto i = List.begin(); i != List.end() && ok; i++)
        ok = i->Update();

またはUpdate()、例外をスローします。

void Update()
{
    do stuff;
    if(bad) throw SomeException();
}

Managerループをtry/catch句でラップします。

于 2012-11-11T18:07:49.973 に答える
-1

変更できる場合は、それが壊れるべきかどうかをマネージャーUpdateに伝えることを返すようにします。bool

    while(1)
    {
        for (auto i = List.begin(); i != List.end(); i++)
            if( !i->Update() )
                 goto end_loop;
    }
    end_loop:

私はgoto外側のループを終了するために使用しました。break恐れている場合は、変数を使用してdoubleを作成できますgoto

returnで実行するものが他にない場合は、代わりに使用できます(使用する必要があります)Loop

于 2012-11-11T18:06:36.910 に答える