我有以下基于组件的架构。如何从特定组件的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();
}
(请注意,为简单起见,我在此示例中忽略了加法器。)
答案 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
。