Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 中断代码执行_C++_Algorithm_Loops_Components_Break - Fatal编程技术网

C++ 中断代码执行

C++ 中断代码执行,c++,algorithm,loops,components,break,C++,Algorithm,Loops,Components,Break,我有以下基于组件的体系结构。如何从特定组件的更新功能中打破更新组件的管理器循环 组成部分 class Component { virtual void Update() = 0; }; 经理 class Manager { vector<Component*> List; void Add(Component* cpnt) { List.push_back(cpnt); } void Loop() {

我有以下基于组件的体系结构。如何从特定组件的更新功能中打破更新组件的管理器循环

组成部分

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();
        }
    }
};

(请注意,为了简单起见,我在本例中忽略了ACCESOR。)

您可以根据
Update
返回值,您可能不希望继续循环


您也可以使用异常。

您可以使
更新
返回值,根据该值,您可能不希望继续循环


您也可以使用异常。

您可以从
Update
抛出异常并在循环外捕获它,或者从循环中断开异常,具体取决于
Update
的返回值

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


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

您可以从
Update
中抛出异常并在循环外捕获它,也可以从循环中捕获异常,具体取决于
Update
的返回值

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


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

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

    while(1)
    {
        for (auto i = List.begin(); i != List.end(); i++)
            if( !i->Update() )
                 goto end_loop;
    }
    end_loop:
我使用了
goto
退出外部循环,如果您害怕
goto
,可以使用一个变量进行双
break


如果
循环中没有更多要执行的操作,您可以(也应该)使用
返回

如果您可以更改
更新
,则让它返回一个
bool
,告诉经理它是否应该中断

    while(1)
    {
        for (auto i = List.begin(); i != List.end(); i++)
            if( !i->Update() )
                 goto end_loop;
    }
    end_loop:
我使用了
goto
退出外部循环,如果您害怕
goto
,可以使用一个变量进行双
break

如果
循环
中没有更多要执行的内容,则可以(也应该)使用
返回
,使
更新()
返回指示是否停止的代码,并在
管理器
循环中检查该代码。或者抛出一个异常,这更像是
C++
,如果突发事件不是经常发生的话

也就是说,通过以下
Manager
循环将
virtual void Update()
更改为
virtual bool Update()
或类似内容:

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
子句中。

Make
Update()
返回指示是否停止的代码,并在
Manager
循环中检查该代码。或者抛出一个异常,这更像是
C++
,如果突发事件不是经常发生的话

也就是说,通过以下
Manager
循环将
virtual void Update()
更改为
virtual bool Update()
或类似内容:

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();
}

并将
管理器
循环包装在
try
/
catch
子句中。

请解释引发异常的原因好吗?如果您对
C++
异常一无所知,您可以阅读关于它们的信息,不要将异常用于流控制。您能解释引发异常的原因吗,请?如果您对
C++
异常一无所知,您可以阅读关于它们的信息,不要将异常用于流控制。更新函数中的循环远远不止这些。基本上所有组件的逻辑都放在那里。@sharethis我刚才说的
Manager::Loop
while
之后。如果在while的结束括号后有一些代码,则需要打断它。否则您可以直接
返回除了在更新函数中执行循环之外,还有很多其他功能。基本上所有组件的逻辑都放在那里。@sharethis我刚才说的
Manager::Loop
while
之后。如果在while的结束括号后有一些代码,则需要打断它。否则您可以直接
返回+1我希望更多的人在最后两句话中遵循使用模式。谢谢,这是经理在某个时候结束的逻辑的一部分。+1我希望更多的人在最后两句话中遵循使用模式。谢谢,这是管理器某个时候结束的逻辑的一部分。+1表示仅包含代码的相关部分:)+1表示仅包含代码的相关部分:)