【问题标题】:Jumping back to beginning of function in C++在 C++ 中跳回到函数的开头
【发布时间】:2013-10-02 22:23:26
【问题描述】:

所以我有需要跳出当前函数并回到函数开头的情况,其中一些包括错误检查(我没有学过trythrowcatch然而)并且最近我一直在使用递归,忽略了递归不像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() 的行。如果它存在,但我知道这是我能做的最糟糕的事情。

【问题讨论】:

  • 如果跳回到函数的开头,你将如何摆脱糟糕的状态?你乞求陷入无限循环。
  • @Beta 在函数内通常会有提示让客户输入一些东西,跳回来会让他们再次有机会正确输入一些东西。抱歉,我应该指定的。

标签: c++ function methods recursion


【解决方案1】:

goto 不是“你能做的最糟糕的事情”;事实上,在某些情况下,明智的goto 比任何替代方案都更具可读性。

但是,这不是其中之一。我建议你这样做:

TYPE input_thing_from_user()
{
    TYPE rv;
    do
        rv = read_input_from_user();
    while (is_invalid(rv));
    return rv;
}

为每个要输入的内容使用单独的循环;如果用户在列表末尾附近搞砸了,不要让用户重新输入所有内容。

【讨论】:

  • 我不太确定TYPE 是什么。通常这些东西也会循环每个输入,因此如果他们搞砸了,他们不必重做所有的事情,因为他们已经存储了其他数据。只是在他们搞砸的时候,他们可以重新输入那个东西。
  • TYPE 是您从用户那里读取的输入需要具有的任何类型的占位符。如果存在依赖于多个输入的输入有效性检查,请在该组输入周围放置另一个循环。
  • 啊,我明白了。所以基本上只是嵌套 while 循环。
  • 是的!任何时候你可能需要回去重做一些事情,首先思考循环。 (有时循环不是答案,但很有可能它们是。)另外,如果您发现自己的循环嵌套深度超过两个,可能是时候考虑将函数分解成更小的部分了。
  • 额外的功劳(如果你已经学习过模板的话)TYPE可以是一个模板类型,而read_inpu_from_user,如果它把rv作为ref或指针的传递,可能是每个TYPE的重载函数
【解决方案2】:

你可以这样做:

int foo()
{
    while (true)
    {
        ...
        if (/* this should start over */)
            continue;
        ...
        if (/* this should end */)
            return /* some value */;
        ...
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-07
    • 1970-01-01
    • 2021-05-27
    • 2019-02-22
    • 1970-01-01
    • 1970-01-01
    • 2014-06-19
    相关资源
    最近更新 更多