Может ли функция С++ возвращать более одного значения?

Возможный дубликат:
может ли функция вернуть более одного значения?

Я хочу вернуть 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;
}