4

我希望能够拥有一个简单地从用户那里获取两个输入值并返回这些值以供主函数使用的函数。

我希望值 a 和 b 仅驻留在 getvals 函数中,并作为 x 和 y 传递给主函数。

我想我在这里可能会以错误的方式处理事情,因为我已经搜索了很多并且找不到任何类似的方法来做到这一点,但任何帮助将不胜感激。

#include <iostream>

using namespace std;


int x = 100;
int y = 42;
int result1;
int result2;
int a;
int b;

int getvals(int,int)
{
    cout << "input value a ";
    cin >> a;
    cout << "input value b ";
    cin >> b;

    return a,b;
}

int main()
{
    getvals(x,y);
    result1 = x + y;


    cout << "\n\n";
    cout << " x + y = " << result1;
    return 0;
}
4

5 回答 5

8

一个函数只能返回一个值。幸运的是,您可以将两个值包装在一个结构或一个类中,并将其作为一个对象返回。这正是std::pair设计的目的。

std::pair<int,int> getvals()
{
    std::pair<int,int> p;
    cout << "input value a ";
    cin >> p.first;
    cout << "input value b ";
    cin >> p.second;

    return p;
}

int main()
{
    std::pair<int,int> p = getvals();
    int result1 = p.first + p.second;
    ...
}

C++11 引入了更通用的std::tuple,它允许任意数量的元素。

std::tuple<int,int> getvals()
{
    int a,b;
    cout << "input value a ";
    cin >> a;
    cout << "input value b ";
    cin >> b;

    return std::make_tuple(a,b);
}

int main()
{
    int x,y;
    std::tie(x,y) = getvals();
    ...
}
于 2013-08-15T22:19:41.927 回答
4

使用a和的引用b

void getvals(int &a, int &b)
{
    cout << "input value a ";
    cin >> a;
    cout << "input value b ";
    cin >> b;
}

这声明getvals()采用两个参考参数。对对象引用的修改会修改传入函数调用的对象。

如果没有引用,则参数是按值传递的,这会创建传递给函数的对象的副本。然后,对函数中的参数所做的修改只会影响副本。

或者,您可以使用std::pair<int, int>从您的函数返回两个整数值(它不需要输出参数)。first您可以手动将and成员解包second到变量xy中,或者您可以实现一个帮助类来为您执行此操作。例如:

std::pair<int, int> getvals () {
    std::pair<int, int> p;
    std::cin >> p.first;
    std::cin >> p.second;
    return p;
}

template <typename T, typename U>
struct std_pair_receiver {
    T &first;
    U &second;
    std_pair_receiver (T &a, U &b) : first(a), second(b) {}
    std::pair<T, U> operator = (std::pair<T, U> p) {
        first = p.first;
        second = p.second;
        return p;
    }
};

template <typename T, typename U>
std_pair_receiver<T, U> receive_pair (T &a, U &b) {
    return std_pair_receiver<T, U>(a, b);
}

int main () {
    int x, y;
    receive_pair(x, y) = getvals();
    //...
}

如果您有可用的 C++11,则可以使用更通用tupletie帮助程序以更简洁的方式类似地执行此操作。这在本杰明林德利的回答中得到了说明。

于 2013-08-15T22:18:37.433 回答
2

您似乎是通过参数返回的一半。所有你需要改变的是:

void getvals( int& a, int& b )
{
    cout << "input value a ";
    cin >> a;
    cout << "input value b ";
    cin >> b;
}

注意&参数名称之前的,表示通过引用传递。这意味着当它们在函数中发生变化时,它们也会在调用者中发生变化。不需要return

于 2013-08-15T22:19:21.393 回答
1

通过引用您的函数传递值并将其定义更改为返回 void。像这样的东西:

void getvals(int &a,int &b)
{
    cout << "input value a ";
    cin >> a;
    cout << "input value b ";
    cin >> b;
    return;
}
于 2013-08-15T22:23:03.567 回答
0

您只能从函数返回一件事。那东西可以是一个数组,在某些情况下可能是合适的。

Right Thing(TM) 通常是在调用函数中声明变量。将对这些变量的引用传递给应该设置它们的函数。使用您在函数中传递的引用可以在调用者中设置变量,就像返回它们一样。如果你走这条路,让函数返回成功/失败并通过引用处理所有数据输出可能是个好主意。

祝你好运。我拉着你。我们谁都跑不了。

于 2013-08-15T22:21:02.873 回答