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
子句中。MakeUpdate()
返回指示是否停止的代码,并在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表示仅包含代码的相关部分:)