如何从函数内部修改范围变量?

Eva*_*urg 2 c++ function

这是在C++(Eclipse Mars,如果重要,编译器MinGW).假设我想将一个字符串拆分为一个字符上的两个字符串,并使用一个函数:

int strParse(const string& a) {
    // parse line read input
    int b = a.find("-");
    firstsplit = a.substr(0, b);
    secsplit = a.substr(b + 1);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但是我想定义firstsplitsecsplit不是全局变量,但是在main()它们被使用的范围内.当它们在那里被定义时,它们不能在函数中使用,但我需要函数来定义它们以供部分使用main.

Sam*_*hik 9

你当然可以定义它们main()并通过引用传递它们.但那很草率.

如果你要分析这种情况,firstsplitsecsplit为您的函数计算的.

因此,您的函数应该返回这些值.这就是函数的全部内容:它计算一些东西,然后返回它.

一种方法是简单地返回一个std::pair.

std::pair<std::string, std::string> strParse(const string& a) { //parse line read input
    int b = a.find("-");
    std::string firstsplit = a.substr(0, b);
    std::string secsplit = a.substr(b + 1);
    return std::make_pair(firstsplit, secsplit);
}
Run Code Online (Sandbox Code Playgroud)

但是如果你的函数也可能需要返回其他东西,或者其他一些替代结果,例如错误指示,这将导致更多的工作和更多的重写.

最灵活的方法是函数返回一个类:

class parse_results {

public:

     std::string firstsplit;
     std::string secsplit;
};

parse_results strParse(const string& a) { //parse line read input
    parse_results ret;

    int b = a.find("-");
    ret.firstsplit = a.substr(0, b);
    ret.secsplit = a.substr(b + 1);
    return ret;
}
Run Code Online (Sandbox Code Playgroud)

然后,如果您需要在此处返回任何类型的附加信息,可以将其添加到parse_results课程中.

  • @KostasRim我不会.原样或者如果OP使用`std :: tuple`将允许它们在C++ 17中出现时使用结构化绑定. (2认同)