Это на 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
.
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
.
Я предлагаю вам объявить два std::string
в main, а затем передать их в качестве аргументов функции. Если это не то поведение, которое вы ищете, вы можете вместо этого заставить функцию возвращать std::vector<string>
.
Я хотел бы отметить, что метод string::find()
возвращает size_t
, а не int
. Если вы не уверены в типе, вы всегда можете использовать auto
.
Ваше возвращаемое значение {{X0}} бесполезно; всегда 0. Вместо этого просто верните две строки в виде двухэлементного {{X1}} или {{X2}}.…
Ваше возвращаемое значение int
бесполезно; всегда 0. Вместо этого просто верните две строки в виде двухэлементного struct
или std::array
.
Похожие вопросы
Новые вопросы
c++
C++ — это язык программирования общего назначения. Изначально он разрабатывался как расширение C и имел аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде, который будет скомпилирован с помощью компилятора C++. Используйте тег версии для вопросов, связанных с конкретной стандартной версией [C++11], [C++14], [C++17], [C++20] или [C++23]. и т.д.