2010-04-03 37 views
11

Duplicar posible:
Returning multiple values from a C++ function¿puede una función devolver más de un valor?

puede devolver una función más de un valor?

Edición
Excepto retorno por referencia.

+2

¿Idioma agnóstico o C++? –

+1

En caso de que quiera una descripción general independiente del idioma, aquí hay una pregunta: http://stackoverflow.com/questions/1468375/how-do-you-return-two-values-from-a-single-method –

+0

Puede devolver como una matriz o puede pasar una matriz como referencia y almacenar estos valores en esa matriz. – pocoa

Respuesta

11

No, pero se puede devolver un pair o boost::tuple que puede contener varios valores.

Además, puede utilizar referencias a devolver varios valores de la siguiente manera:

void MyFunction(int a, int b, int& sum, int& difference); 

que llamarían esta función como esta:

int result_sum; 
int result_difference; 
MyFunction(1, 2, result_sum, result_difference); 

Como señala Hogan, técnicamente esto no es devolviendo variables múltiples, sin embargo, es un buen sustituto.

+7

Nit pick: "Además, puede devolver varios valores como este:" debería ser "Además, puede modificar varios valores como este:". También puede modificar variables con ámbito global. – Hogan

14

Sí - haga que su función devuelva una estructura. O devuelva los valores a través de los parámetros de referencia.

struct A { 
    int x, y; 
    A(int a, int y) : x(x), y(y) {} 
}; 

A myfun() { 
    return A(0, 42); // return two values 
} 

o:

void myfun(int & a, int & b) { 
    a = 0; 
    b = 42; 
} 
+4

Aunque técnicamente ese es todavía un valor en C –

+0

¿Responde esto a la pregunta, "¿Puede una función modificar más de un valor?" También puede modificar globales si quiere estar completo. – Hogan

+0

pero aún así solo se ha enviado un valor (su dirección) y podemos acceder al objeto completo copiándolo en otro objeto. Quiero saber específicamente si podemos asignar dos valores simultáneamente. –

1

Una función puede devolver valores en las formas especificadas:

  • Via valor de retorno de cualquier tipo
  • A través de un puntero
  • A través de una referencia
  • Via establecer una variable global (altamente no recomendable)

Si necesita un valor de retorno independiente, normalmente debe envolver los tipos que necesita en una estructura y devuelve un objeto de esa estructura por valor. Si quiere evitar guardar una copia local, debe pasar un parámetro de referencia para modificar.

18

En la biblioteca boost::tuple, hay a function called tie que simplifica el proceso de obtención de información de un tuple devuelto. Si tiene una función que devolvió tuple de dos double sy desea cargarlos en dos variables locales x y y, puede asignar el valor de retorno de su función a boost::tie(x, y).

Ejemplo:

#include <math.h> 
#include <iostream> 
#include <boost/tuple/tuple.hpp> 

const double PI = 3.14159265; 

boost::tuple<double, double> polar_to_rectangular(double radius, double angle) 
{ 
    return boost::make_tuple(radius * cos(angle), radius * sin(angle)); 
} 

int main() 
{ 
    double x; 
    double y; 

    boost::tie(x, y) = polar_to_rectangular(4, (45 * PI)/180); 
    std::cout << "x == " << x << ", y == " << y << std::endl; 

    return 0; 
} 
+4

genial, no sabía que –

-4
main() 
{ 
    int a=10,b=20; 
    int *c; 
    c=aa(a,b); 
    printf("%d %d",*c,*c+1); 
} 

void aa(int a,int b) 
{ 
    int c1[2]; 
    c1[0]=b+a; 
    c1[1]=a-b; 
    return(c1); 
} 

aquí, la dirección de c1 será devuelto. por lo que se almacenará en main ciable.podemos recuperar ambas variables mediante el puntero,

+2

conduce a un comportamiento indefinido. La vida útil de 'c1' termina cuando' aa' queda, por lo que 'c' se deja apuntando a un objeto muerto. Acceder a ella conduce a un comportamiento indefinido. – GManNickG

+2

comportamiento indefinido. –

0

estructura de uso y devolver múltiples valores con diferentes tipos de datos.

1
#include<stdio.h> 
#include<stdlib.h> 
#include<string.h> 

typedef struct 
{ 
    int a; 
    int b; 
}Mystruct; 

Mystruct myfun(); 

int main() 
{ 
    char name[30]; 
    Mystruct ms2; 
    ms2 = myfun(); 
    printf("val1: %d val2: %d",ms2.a,ms2.b); 
    return 0; 
} 

Mystruct myfun() 
{ 
    int a,b; 
    Mystruct ms; 

    a = 10; 
    b = 20; 
    ms.a=a; 
    ms.b=b; 

    return(ms); 
} 
Cuestiones relacionadas