跳回到C++的功能开头
Jumping back to beginning of function in C++
所以我有需要脱离当前函数并回到函数开头的情况,其中一些包括错误检查(我还没有学过try
、throw
或catch
(,直到最近我一直在使用递归,忽略了递归不像goto
那样起作用的事实,只是返回到函数的开头,而是创建一个单独的复制自身,因此,如果我使用递归来捕获客户端输入错误之类的内容,如果客户端犯了足够的错误,则可能导致潜在的内存泄漏。
我想知道是否有一个特定的功能可以让我"重新启动"一个功能。
作为使用伪伪代码的示例:
int foo(){
//prompt for and receive input
if(!matchCondition)
//stop foo() and restart foo()
//does something
}
我唯一能想到的另一件事是将函数调用放在循环中,但如果例如函数在 main()
我无法准确地将调用main
放在 main
内的循环中,而不创建至少一个副本,这不是最佳的。另一个不起作用的例子是,如果函数需要返回没有限制的东西,因此可以自然地生成"错误代码"而不会发生错误。
bool ifError=1;
while(ifError){
ifError = foo();
}
int foo(){
//prompt for and receive input
if(!matchCondition)
return 1;
//do something
return 0;
}
我唯一能想到的是一个goto
的声明,指向foo()
被调用的线路。 如果它存在,但我知道这是我能做的最糟糕的事情。
>goto
并不是"你能做的最糟糕的事情";事实上,在某些情况下,明智的goto
比任何替代方案都更具可读性。
但是,这不是这些时间之一。 我建议你做这样的事情:
TYPE input_thing_from_user()
{
TYPE rv;
do
rv = read_input_from_user();
while (is_invalid(rv));
return rv;
}
对要输入的每个内容使用单独的循环;如果用户在列表末尾附近搞砸了,请不要让用户重新键入所有内容。
你可以做:
int foo()
{
while (true)
{
...
if (/* this should start over */)
continue;
...
if (/* this should end */)
return /* some value */;
...
}
}
相关文章:
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- 多态性和功能结合
- 带内存和隔离功能的SQLite
- 在CMakeLists.txt的安装功能中使用.cmake文件有什么用
- 类模板的成员功能的定义在单独的TU中完全专业化
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 如何在C++中获得"静态纯虚拟"功能?
- 两个文件使用彼此的功能-如何解决
- 我应该实现右值推送功能吗?我应该使用std::move吗
- QML按钮点击功能执行顺序
- 无法理解此 return 语句的功能,没有它就会发生运行时错误
- 有没有可能有一个只有ADL才能找到的非好友功能
- 功能样式转换从 'int' 到 'ItemType' 的匹配转换
- 文件系统:复制功能的速度秘诀是什么
- 在用于格式4的arm模拟器中实现功能时的一个问题
- 如何在Directwrite中获得给定字体的可用OpenType功能
- Visual Studio(或任何其他工具)能否将地址解释为调用堆栈(boost上下文)的开头
- 对可变参数使用声明.如何选择正确的功能
- 询问在设计我的手臂模拟器功能表示格式1
- 跳回到C++的功能开头