C++ 跳回C+中函数的开头+;

C++ 跳回C+中函数的开头+;,c++,function,methods,recursion,C++,Function,Methods,Recursion,因此,在某些情况下,我需要中断当前函数并返回到函数的开头,其中一些包括错误检查(我还没有学习try,throw,或catch)最近,我一直在使用递归,忽略了一个事实,即递归的功能不像goto那样,只是返回到函数的开头,而是创建一个单独的自身副本,因此如果我使用递归捕捉客户端输入错误之类的内容,如果客户端出现足够的错误,这可能会导致潜在的内存泄漏 我想知道是否有一个特定的函数可以让我“重新启动”一个函数 作为使用伪代码的示例: int foo(){ //prompt for and re

因此,在某些情况下,我需要中断当前函数并返回到函数的开头,其中一些包括错误检查(我还没有学习
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;
}
使用一个单独的循环为每件事输入;如果用户在列表末尾出现问题,不要让他们重新键入所有内容。

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 */;
        ...
    }
}
你可以做:

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

如果你跳回到函数的开头,你将如何摆脱糟糕的状态?你在乞求被放入一个无止境的循环中。@Beta在函数中通常会有一个提示让客户端输入一些东西,向后跳会让他们有另一个正确输入东西的机会。对不起,我应该指定。如果您跳回到函数的开头,您将如何摆脱坏状态?你在乞求被放入一个无止境的循环中。@Beta在函数中通常会有一个提示让客户端输入一些东西,向后跳会让他们有另一个正确输入东西的机会。对不起,我应该指定的。我不太确定
类型是什么。通常,这些东西也会循环每个输入,因此,如果他们搞砸了,他们就不必全部重做,因为他们已经存储了其他数据。只是在那些他们确实搞砸的时候,他们可以重新放那东西。TYPE是一个占位符,表示您从用户那里读取的输入需要具有的任何类型。如果存在依赖于多个输入的输入有效性检查,则在该组输入周围放置另一个循环。啊,好的,我明白了。所以基本上只是在循环时嵌套。是的!任何时候你可能需要回去重做一些东西,首先考虑循环。(有时循环不是答案,但很可能是答案。)此外,如果您发现自己嵌套的循环超过两个深度,那么可能是时候考虑将函数拆分为更小的部分了。为了获得额外的学分(如果您已经学习过模板),TYPE可以是模板类型,read_inpu_from_user,如果它将rv作为一个pass-by-ref或指针,则可能是每个类型的重载函数。我不太确定
类型是什么。通常,这些东西也会循环每个输入,因此,如果他们搞砸了,他们就不必全部重做,因为他们已经存储了其他数据。只是在那些他们确实搞砸的时候,他们可以重新放那东西。TYPE是一个占位符,表示您从用户那里读取的输入需要具有的任何类型。如果存在依赖于多个输入的输入有效性检查,则在该组输入周围放置另一个循环。啊,好的,我明白了。所以基本上只是在循环时嵌套。是的!任何时候你可能需要回去重做一些东西,首先考虑循环。(有时循环不是答案,但很可能是答案。)此外,如果您发现自己嵌套的循环超过两个深度,那么可能是时候考虑将函数拆分为更小的部分了。为了获得额外的学分(如果您已经学习过模板),TYPE可以是模板类型,read_inpu_from_user,如果它将rv作为传递引用或指针,则可能是每种类型的重载函数