中断代码执行

Interrupt Code Execution

本文关键字:执行 代码 中断      更新时间:2023-10-16

我有以下基于组件的架构。如何从特定组件的更新功能中脱离正在更新组件的管理器循环?

元件

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

(请注意,为了简单起见,我在此示例中忽略了访问器。

您可以从Update中抛出异常并将其捕获到循环外部,也可以根据Update的返回值从循环中break

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

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

您可以创建Update返回值,基于该值您可能不希望继续循环。

您还可以使用例外。

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

如果可以更改Update,则使其返回一个bool,告诉经理它是否应该中断。

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

我用goto退出外循环,如果你害怕goto,你可以用变量做双break

如果Loop中没有更多要执行的内容,您可以(并且应该)改用return