中断代码执行
Interrupt Code Execution
我有以下基于组件的架构。如何从特定组件的更新功能中脱离正在更新组件的管理器循环?
元件
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
。
相关文章:
- 需要将此代码更改为执行代码
- 当前不会命中断点。没有调试器目标代码类型的可执行代码与此文件关联
- 单步执行代码时重复上一行
- 如何使用介子在C++中执行代码覆盖?
- Visual Studio 2017,C++,在单步执行代码时指向错误的行
- 在 R 中执行C++代码
- 通过 dll 注入在主线程中执行代码
- 无法在 c++ 中循环后执行代码
- 执行C 代码时快速频繁的文件访问
- 执行 C++ 代码后出错
- 一个人如何从代表函数的字符串中执行运行时执行C 代码
- 是否可以在程序崩溃后执行代码?
- 第一次在 Linux 上执行 c++ 代码的时间非常慢
- 计算 JSON 中的条目数并相应地执行代码
- 将在 CATCH 块之后执行代码
- 分析执行C++代码的每一行所花费的确切时间
- 我在执行代码时不断得到"Bus Error"?
- c while()..执行代码行的条件
- 从并行线程在主 Maya 线程上执行代码
- 在调用GNUPLOT之后,如何继续执行C 代码