Это на 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;
}

Но я бы хотел определить firstsplit и secsplit не как глобальные переменные, а в рамках main(), в которых они используются. Когда они там определены, их нельзя использовать в функции, но мне нужна функция, чтобы определить их для использования в части main.

2
Evan Weissburg 3 Сен 2016 в 18:33

4 ответа

Лучший ответ

Вы, конечно, можете определить их в main() и передать их по ссылке. Но это небрежно.

Если бы вы проанализировали эту ситуацию, ваша функция вычисляет firstsplit и secsplit.

Следовательно, ваша функция должна возвращать эти значения. В этом суть функции: она что-то вычисляет и возвращает.

Один из способов сделать это - просто вернуть 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.

9
Sam Varshavchik 3 Сен 2016 в 15:49

Я предлагаю вам объявить два std::string в main, а затем передать их в качестве аргументов функции. Если это не то поведение, которое вы ищете, вы можете вместо этого заставить функцию возвращать std::vector<string>.

Я хотел бы отметить, что метод string::find() возвращает size_t, а не int. Если вы не уверены в типе, вы всегда можете использовать auto.

1
KostasRim 3 Сен 2016 в 15:43

Ваше возвращаемое значение {{X0}} бесполезно; всегда 0. Вместо этого просто верните две строки в виде двухэлементного {{X1}} или {{X2}}.…

0
Tingur 3 Сен 2016 в 15:37

Ваше возвращаемое значение int бесполезно; всегда 0. Вместо этого просто верните две строки в виде двухэлементного struct или std::array.

0
Kyle Strand 3 Сен 2016 в 15:52