回到C ++中的函数开头

时间:2013-10-02 22:23:27

标签: c++ function methods recursion

所以我遇到需要突破当前函数并回到函数开头的情况,其中一些包括错误检查(我没有学习trythrow,或者catch但是最近我一直在使用递归,忽略了这样一个事实,即递归不像goto那样起作用,只是返回到函数的开头,而是创建一个单独的自身副本因此,如果我使用递归来捕获客户端输入错误之类的东西,如果客户端产生足够的错误,则可能导致潜在的内存泄漏。

我想知道是否有一个特定的功能可以让我'重启'一个功能。

作为使用伪伪代码的示例:

int foo(){
     //prompt for and receive input
     if(!matchCondition)
          //stop foo() and restart foo()
     //does something
}

我能想到的唯一另一件事是将函数调用放在循环中,但如果函数在main()中,那么这不是最佳的我不能完全调用{{1}在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被调用的行。如果它存在,但我知道这是我做过的最糟糕的事情。

2 个答案:

答案 0 :(得分:5)

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

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

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

使用单独的循环输入每个东西;如果用户在列表末尾附近陷入困境,请不要让用户重新输入所有内容。

答案 1 :(得分:1)

你可以这样做:

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