我对结构和用户定义的数据类型完全不熟悉,我试图创建一个返回结构的函数:
评论突出了问题:
#include <iostream>
using namespace std;
struct num {
int n[2];
};
num func( num x, int a, int b) {
x.n[0] = a+b;
x.n[1] = a*b;
return x;
}
int main() {
int x,y;
num s1;
cout << "enter: ";
cin >> x >> y;
func(s1,x,y);
cout << s1.n[0] << "\n" << s1.n[1]; // THIS GIVES ERROR
cout << func(s1,x,y).n[0] << "\n" << func(s1,x,y).n[1]; // THIS DOENST GIVE ERROR
return 0;
}
我理解第二种方法有意义并返回struct变量。然后放一个点来解决struct的内部变量。
但我不明白为什么第一种方法失败,或者给出奇数输出。该功能已完成其工作,即s1.n[0] = x + y
和s1.n[1] = x*y
现在,打印s1.n[0]
应仅打印x + y
。我们如何检查和纠正函数的内部工作原理?
答案 0 :(得分:3)
您必须将返回的值分配给main
中的结构对象s1 = func(s1,x,y);
在体内,该函数处理原始对象的副本。它不会更改原始对象,因为它是按值传递的。
另一种方法是通过引用传递结构
void func( num &x, int a, int b) {
x.n[0] = a+b;
x.n[1] = a*b;
}
在这种情况下,你可以写一下
func(s1,x,y);
或者你甚至可以使用所谓的C方法来传递参考
void func( num *x, int a, int b) {
x->n[0] = a+b;
x->n[1] = a*b;
}
并将其称为
func( &s1, x, y );
至于这句话
cout << func(s1,x,y).n[0] << "\n" << func(s1,x,y).n[1];
然后您访问由函数的两次调用返回的两个临时对象的数据成员。执行此语句后,这些临时对象将被删除。
答案 1 :(得分:3)
看起来您永远不会分配func()
的返回值。您的函数返回结构,但您永远不会分配它。要解决这个问题,您应该能够简单地说:s1 = func(s1,x,y);
这会将结构的修改版本分配给s1变量。
或者,您可以重写func()
以接受指向结构的指针。这将允许您修改结构而不必返回它:
void func( num *x, int a, int b) {
x->n[0] = a+b;
x->n[1] = a*b;
}
然后,您只需将来电更改为func()
即可:func(&s1, x, y);
答案 2 :(得分:2)
您没有通过引用传递结构,因此结果。请尝试以下方法:
void func(num &x, int a, int b) {
x.n[0] = a+b;
x.n[1] = a*b;
}
由于您的结构通过引用传递,因此不需要函数返回任何内容,无论如何它都会被更改。虚空会更合适。
答案 3 :(得分:1)
这是因为您已经按值传递了结构,而您的意图看起来像是想通过引用传递。 请检查此链接:http://courses.washington.edu/css342/zander/css332/passby.html
num func( num &x, int a, int b)
应解决您的问题