2011-06-18 90 views

回答

6

您只能在C++中返回一個值。如果您需要返回更多信息,請返回一個結構(或例如一個容器,例如std::vector),或者將某些變量作爲非常量引用(或指針)傳入並更改它們。

0

你不能。然而,你可以做技巧來僞造它。例如,讓你的函數返回一個指向int的指針,並將指針返回給一個int數組。

1

沒有,但有兩種方法可以做到這一點:

1)給出的指針的值,以「迴歸」爲參數,您更改功能的它的價值。

2)您可以創建一個包含所有這些值的struct並返回該結構。但是,只有在確實需要時才使用它,但第一種解決方案要好得多。

23

C++函數只能返回一個值。但是,您可以通過將它們包裝到類或結構中來返回多個值。

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

+1爲std ::元組。 :) – Macke

+0

同上:) – SteeveDroz

+0

如果你想從一個函數接受多個值,一個方便的方法是使用'std :: tie' http://stackoverflow.com/a/2573822/502144 – user502144

4

或者您可以使用std::pair獲得兩個結果,並查看兩個以上的boost::tuple。它甚至可以在同一個元組中處理不同的類型。

+1

你也可以用'pair ,C>'模擬一個'triple ':-) – fredoverflow

6

嘗試使用return(5,4);但這是一個語法錯誤。

這不是一個語法錯誤。 (5,4)是一個有效的表達式,這裏的,是一個運算符。因此,表達式(5,4)的計算結果爲最右邊的操作數,即4。因此它將返回4


現在來到你的問題:定義一個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

有幾種方法可以實現這一點。

  1. 如果你有相同類型的對象,std::array將是一個很好的返回類型。
    如果您有不同的號碼,請改爲使用std::vector

  2. 如果你有(固定數量的)不同類型,使用std::tuple

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

我知道沒有辦法返回不同數量的內置於不同類型的非多態對象語言或標準庫。

+0

return std :: make_tuple –

+0

@Martin:在這種情況下工作。但是,如果我寫了'4711'而不是'4711l'呢? – sbi

+0

然後你得到一個編譯時錯誤。這是一件好事。 –

0

return (a, b, c, ... , n)的陳述abc用逗號分隔的運營商和所述表達式的計算結果到最右邊的操作數n。所以語法是正確的,但不會返回多個值。

返回多個值:

  • 將要在結構恢復並返回它的變量。
  • 或者進行多變量(動態分配)的陣列,並返回基址
0

這裏大部分的答案是正確的,你應該返回一個結構。 如果您有興趣,還有一種方法,那就是通過發送您想要返回的變量的引用。

例如:

#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

返回一個結構。

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

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