2013-03-31 71 views
0

新手問題。 請參閱下面的代碼:從一個函數返回不同值的正確方法

FB::variant TestPluginAPI::getmidX() 
{ 
RECT rect; 
HWND hWnd; 
hWnd = getBrowserHwnd(); 
if(GetWindowRect(hWnd, &rect)) 
    { 

    int width = rect.right - rect.left; 
    int height = rect.bottom - rect.top; 
    int left = rect.left; 
    int mid = (rect.right + rect.left)/2; 
    return mid; 
    } 
else {return 0;} 
} 

我想 - 就是能夠從這個函數mid獲得,例如left,在我的另一個函數使用它在不同的變量。我當然可以複製它,並使功能,只返回left ...是做這種事情的正確方法,或有更優雅的?

回答

2

你想是這樣的:

return std::make_pair(mid,left) 

和返回類型的功能,你就必須std::pair<int, int>。然後當你打電話給你需要的話是這樣的:std::pair<int,int> value = getmidX();,如果你需要的中期,你會做int mid = value.first,如果您需要在左邊,你會做int left = value.second;

要使用這一點,你需要一個比較現代的C++編譯器(很確定最近的VC++會工作),你需要#include<utility>

+0

哦,謝謝,這是intresting –

2

如果你想返回更多的東西,你可以定義結構和返回結構的函數。 例如:

struct funcRetrun 
{ 
    int left; 
    int mid; 
    int right; 
} 

可以再返回函數裏面的東西,但是,這一點,因爲你需要你的函數的返回類型更改爲funcReturn是不是很優雅。

由於C++ 11,你可以使用std::tuple,如果你想返回更多:

Tuples are objects that pack elements of -possibly- different types together in a single object, just like pair objects do for pairs of elements, but generalized for any number of elements.

3

有幾種選擇。已經給出了struct解決方案,但是(在我看來)他們不是最好的方法。

你應該知道,你可以修改參數的函數,因此你可以這樣做:

int getMidX(int &left, int &width) { 
    // do stuff 
    left = theLeftNumber; 
    width = theWidthNumber; 
    return theMidNumber; 
} 

,並用此稱呼它:

int l; 
int w; 
int m = getMidX(l, w); 

你也可以用指針來代替引用,它可以使返回值爲可選項,並且可以在C中工作(使用*而不是&,並將呼叫更改爲getMidX(&l, &r)。還應該檢查函數中的NULL以瞭解用戶感興趣的值在)。

+0

是的,知道它,但我認爲這不是我的情況,因爲我需要返回一些值,只是不同的計算方法,從相同的功能值給出。但thx無論如何) –

+0

@SinnerSmile我不認爲你理解;該函數不讀*'l'和'w'的值,它*設置*它們。因此給你3個「返回」值。 – Dave

+0

ooooooh,我現在明白了,謝謝。 –