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......这是做这些事情的正确方法,还是有更优雅的方法?

4

3 回答 3

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 以了解用户感兴趣的值在)。

于 2013-03-31T22:01:51.900 回答
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>

于 2013-03-31T21:55:47.873 回答
2

如果你想返回更多的东西,你可以定义 struct 并从函数中返回 struct。例如:

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

然后你可以在函数中返回这些东西,但是,这不是很优雅,因为你需要将你的函数返回类型更改为 funcReturn。

std::tuple从 C++11 开始,如果您想返回更多,可以使用:

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.

于 2013-03-31T21:58:09.713 回答