2011-06-18 31 views

Respuesta

6

Solo puede devolver un valor en C++. Si necesita devolver más información, devuelva una estructura (o un contenedor como un std::vector por ejemplo) o pase algunas variables como referencias (o punteros) no constantes y cámbielas.

0

No puede. Sin embargo, puedes hacer trucos para fingirlo. Por ejemplo, haga que su función devuelva un puntero a int y devuelva el puntero a una matriz de entradas.

1

No, pero hay dos maneras de hacerlo:

1) Dar a los punteros a los valores de "retorno" como parámetros, se cambia el valor de la misma en la función.

2) Puede crear un struct que contenga todos estos valores y devolver la estructura. Úselo solo si es realmente necesario, sin embargo, la primera solución es mucho mejor.

23

Una función C++ puede devolver solo un valor. Sin embargo, puede devolver múltiples valores envolviéndolos en una clase o estructura.

struct Foo 
{ 
    int value1; 
    int value2; 
}; 

Foo SomeFunction() 
{ 
    Foo result = { 5, 4 }; 
    return result; 
} 

O usted podría utilizar std::tuple, si es que está disponible con su compilador.

#include <tuple> 

std::tuple<int, int, int> SomeFunction() 
{ 
    return std::make_tuple(5, 4, 3); 
} 

Si no sabe de antemano cuántos valores que va a volver, una o un recipiente similar std::vector es su mejor apuesta.

También puede devolver múltiples valores al tener un puntero o argumentos de referencia para su función y modificarlos en su función, pero creo que devolver un tipo compuesto generalmente es un enfoque "más limpio".

+2

+1 para std :: tuple. :) – Macke

+0

Igual que arriba :) – SteeveDroz

+0

Si desea aceptar múltiples valores de una función, una forma conveniente de hacerlo es usar 'std :: tie' http://stackoverflow.com/a/2573822/502144 – user502144

4

O puede usar std::pair para obtener dos resultados y mirar boost::tuple para más de dos. Incluso puede manejar diferentes tipos en la misma tupla.

+1

Usted también podría simular un 'triple ' con un 'par , C>' :-) – fredoverflow

6

intenté usar return (5,4); pero este es un error de sintaxis

Eso no es un error de sintaxis. (5,4) es una expresión válida y aquí , es un operador. Por lo tanto, la expresión (5,4) se evalúa como el operando del extremo derecho, que es 4. Por lo tanto, devolverá 4.


Ahora que se acerca a su problema: definir un struct si alguno ya existente no le ayuda, y devolver un objeto de estructura lugar, como:

struct values 
{ 
    int i; 
    int j; 
    char *other; 
}; 

values f() 
{ 
    values v = {/*....*/}; 
    //... 
    return v; 
} 

Y si tipo de todos los valores son iguales, entonces se puede utilizar como 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; 
} 

T aquí hay otros contenedores también, viz. std::map, std::list, std::stack, etc. Utilice el que más le convenga. También hay std::pair que contiene solo dos valores, como su nombre lo indica.

4

Hay varias formas de lograr eso.

  1. Si tiene objetos del mismo tipo, std::array sería un buen tipo de cambio de eso.
    Si tiene números variables, use std::vector en su lugar.

  2. Si usted tiene (un número fijo de) diferentes tipos, utilice std::tuple:

    std::tuple <int, long, double> f() 
    { 
        return std::tuple <int, long, double>(42, 4711l, 3.141); 
    } 
    

sé no hay manera de devolver un número variable de objetos que no son polimórficas de diferentes tipos incorporados en el idioma o biblioteca estándar.

+0

return std :: make_tuple –

+0

@Martin: Eso funciona en este caso. Sin embargo, ¿y si hubiera escrito '4711' en lugar de' 4711l'? – sbi

+0

Luego aparece un error de tiempo de compilación. Lo que es algo bueno. –

0

return (a, b, c, ... , n) Los estados a, b, c están separados con comas operadores y la expresión se evalúa el operando de más a la derecha n. Entonces la sintaxis es correcta, pero no devuelve múltiples valores.

devolver varios valores:

  • Ponga las variables que desea volver en una estructura y devolverlo.
  • O hacer una matriz de múltiples variables (asignados dinámicamente) y devolver la dirección base
0

La mayoría de las respuestas aquí son correctas que debe devolver una estructura. Hay una forma más si está interesado, y eso es enviando referencia de las variables que desea devolver.

Por ejemplo:

#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; 
} 
0

Devuelve una estructura.

struct a 
{ 
    int x; 
    int y; 
    int z; 
}; 

b() 
{ 
    a.x = 2; 
    a.y = 4; 
    a.z = 8; 
    return a; 
} 
Cuestiones relacionadas