中断代码执行

时间:2012-11-11 18:03:58

标签: c++ algorithm loops components break

我有以下基于组件的架构。如何从特定组件的Update函数中突破正在更新组件的Manager循环?

组件

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 个答案:

答案 0 :(得分:3)

您可以从Update引发异常,并在循环外捕获它,或者从循环中break捕获异常,具体取决于Update的返回值。

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

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

答案 1 :(得分:1)

您可以根据此值返回Update返回值。

您也可以使用例外。

答案 2 :(得分: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子句中。

答案 3 :(得分:-1)

如果您可以更改Update,请让它返回bool告诉经理是否应该中断。

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

我已使用goto退出外部循环,如果您害怕break,则可以使用变量生成双goto

如果return中没有其他内容可以执行,您可以(并且应该)使用Loop