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

时间:2016-09-03 15:33:10

标签: 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;
}

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

4 个答案:

答案 0 :(得分: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);
}

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

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

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;
}

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

答案 1 :(得分:1)

我建议你在main中声明两个std::string,然后将它们作为参数传递给函数。如果这不是您要查找的行为,则可以使该函数返回std::vector<string>

我想指出string::find()方法返回size_t而不是int。如果您不确定某种类型,可以随时使用auto

答案 2 :(得分:0)

试 int strParse(const string&amp; a,string&amp; firstsplit,string&amp; secsplit)

答案 3 :(得分:0)

您的int返回值无用;它始终为0.相反,只需返回两个元素structstd::array中的两个字符串。