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并将其捕获,也可以break根据Update.

你选择哪一个取决于逻辑。如果跳出循环是逻辑错误的结果,请使用异常。

如果它是逻辑的一部分,请使用返回。

于 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可以使用变量来制作双精度。breakgoto

如果returnLoop.

于 2012-11-11T18:06:36.910 回答