我希望能够有一个函数,只需从用户获取两个输入值,并返回要使用的main函数的值。
我希望值a和b只驻留在getvals函数中,并作为x和y传递给main函数。
我想我可能会在这里采取错误的方式,因为我经常搜索并找不到任何类似的方法来做到这一点,但任何帮助都会受到赞赏。
#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;
}
答案 0 :(得分: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();
...
}
答案 1 :(得分: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>
从函数中返回两个整数值(然后不需要 out-parameters )。您可以手动将first
和second
成员解压缩到变量x
和y
中,也可以实现帮助程序类来为您执行此操作。例如:
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,则可以使用更通用的tuple
和tie
帮助程序以更干净的方式执行此操作。 Benjamin Lindley的回答说明了这一点。
答案 2 :(得分:2)
你似乎是通过参数返回的一半。你需要改变的是:
void getvals( int& a, int& b )
{
cout << "input value a ";
cin >> a;
cout << "input value b ";
cin >> b;
}
注意参数名称前面的&
,意思是通过引用传递。这意味着当他们改变功能时,他们也会在呼叫者中改变。不需要return
。
答案 3 :(得分:1)
通过引用将值传递给您的函数,并将其更改为返回void。像这样:
void getvals(int &a,int &b)
{
cout << "input value a ";
cin >> a;
cout << "input value b ";
cin >> b;
return;
}
答案 4 :(得分:0)
你只能从一个函数返回一个东西。那个东西可以是一个在某些情况下适当的数组。
通常,Right Thing(TM)将在您的调用函数中声明变量。将对这些变量的引用传递给应该设置它们的函数。使用函数中传递的引用可以在调用者中设置变量,就像返回它们一样。如果你走这条路线,那么让函数返回成功/失败并通过引用处理所有数据输出可能是个好主意。
祝你好运。我在拉你。我们谁都跑不了。