Может ли функция С++ возвращать более одного значения?
Возможный дубликат:
может ли функция вернуть более одного значения?
Я хочу вернуть 3 переменные из функции С++, но поскольку одна функция может иметь только одно возвращаемое значение, как я могу вернуть 3 значения. пытался использовать return (5,4); но это синтаксическая ошибка.
Ответы
Ответ 1
Функция С++ может возвращать только одно значение. Однако вы можете вернуть несколько значений, обернув их в класс или структуру.
struct Foo
{
int value1;
int value2;
};
Foo SomeFunction()
{
Foo result = { 5, 4 };
return result;
}
Или вы можете использовать std::tuple
, если это доступно с вашим компилятором.
#include <tuple>
std::tuple<int, int, int> SomeFunction()
{
return std::make_tuple(5, 4, 3);
}
Если вы не знаете заранее, сколько значений вы собираетесь вернуть, лучше всего выбрать std::vector
или аналогичный контейнер.
Вы также можете вернуть несколько значений, указав указатель или ссылочные аргументы в свою функцию и изменив их в своей функции, но я думаю, что возвращение составного типа, как правило, является "более чистым".
Ответ 2
Вы можете вернуть только одно значение в С++. Если вам нужно вернуть дополнительную информацию, верните структуру (например, контейнер, например, std::vector
), или передайте некоторые переменные как неконстантные ссылки (или указатели) и измените их.
Ответ 3
попытался использовать return (5,4); но это синтаксическая ошибка.
Это не синтаксическая ошибка. (5,4)
является допустимым выражением, и здесь ,
является оператором. Таким образом, выражение (5,4)
вычисляет самый правый операнд, который равен 4
. Следовательно, он вернет 4
.
Теперь приступим к вашей проблеме: определите struct
, если какой-либо существующий вам не поможет, и вместо этого верните объект struct, как:
struct values
{
int i;
int j;
char *other;
};
values f()
{
values v = {/*....*/};
//...
return v;
}
И если тип всех значений одинаковый, вы можете использовать std::vector
как:
#include <vector> //must include it!
std::vector<int> f()
{
std::vector<int> v;
v.push_back(5);
v.push_back(4);
//so on
//...
return v;
}
Существуют и другие контейнеры, а именно: std::map
, std::list
, std::stack
и т.д. Использование, которое подходит вам наилучшим образом. Существует также std::pair
, который содержит только два значения, как следует из названия.
Ответ 4
Или вы можете использовать std::pair
для двух результатов и посмотреть boost::tuple
более двух. Он может обрабатывать разные типы в одном кортеже.
Ответ 5
Существует несколько способов достижения этого.
-
Если у вас есть объекты того же типа, std::array
будет хорошим типом возврата для этого.
Если у вас разные числа, используйте std::vector
.
-
Если у вас (фиксированное число) разных типов, используйте std::tuple
:
std::tuple <int, long, double> f()
{
return std::tuple <int, long, double>( 42, 4711l, 3.141 );
}
Я не знаю, как вернуть переменное количество неполиморфных объектов разных типов, встроенных в язык или стандартную библиотеку.
Ответ 6
Нет, но есть два способа сделать это:
1) Дайте указателям значения для "возврата" в качестве параметров, вы измените его значение в функции.
2) Вы можете создать struct
, который содержит все эти значения и вернуть структуру. Используйте это только в том случае, если это действительно необходимо, но решение кулака намного лучше.
Ответ 7
Вы не можете. Вы можете, однако, сделать трюки, чтобы подделать его. Например, чтобы ваша функция вернула указатель на int и вернула указатель на массив ints.
Ответ 8
return (a, b, c, ... , n)
Операторы a
, b
, c
разделяются запятыми операторами, и выражение вычисляется в самый правый операнд n
. Поэтому синтаксис верен, но не возвращает несколько значений.
Чтобы вернуть несколько значений:
- Поместите переменные, которые вы хотите вернуть в структуре, и верните их.
- Или создать массив из нескольких переменных (динамически распределенных) и вернуть базовый адрес
Ответ 9
Большинство ответов здесь верны, что вы должны вернуть структуру.
Есть еще один способ, если вы заинтересованы, и это путем отправки ссылки на переменные, которые вы хотите вернуть.
Например:
#include<iostream>
#include<cstdio>
using namespace std;
bool f(int a,int b,int& q,int& r)
{
if(b==0)return 0;
q=a/b;
r=a%b;
return 1;
}
int main()
{
int a=64,b=7,q,r;
bool pos=f(a,b,q,r);
if(pos)
{
printf("Quotient = %d Remainder = %d\n",q,r);
}
else
{
printf("Divison by zero not possible!\n");
}
return 0;
}
Ответ 10
Можно вернуть более одного значения из функции, которую вы должны использовать для этого указателя. Также это возможно, используя аргументы указателя аргументов указателя сохраняют свое значение '
Подробное использование указателя для возврата более одного значения - http://www.techyv.com/questions/how-do-i-return-multiple-variables-c-function
Ответ 11
Возвращает структуру.
struct a
{
int x;
int y;
int z;
};
b()
{
a.x = 2;
a.y = 4;
a.z = 8;
return a;
}