我最近开始学习C ++,做一些简单的类/朋友函数练习,我试图做的是,通过使用友元函数从用户获取2个数字,然后再使用友元函数,将这2个数字相乘并显示在屏幕上。让我们说我按顺序输入了2,3,4,5。预期的输出是6和20,但我只能在屏幕上看到0和0。
#include<iostream>
using namespace std;
class iluvcpp {
int no_1, no_2;
public:
iluvcpp(){}
~iluvcpp(){}
friend void inputno(iluvcpp obj);
friend int multiply(iluvcpp obj);
}multi_1, multi_2;
void inputno(iluvcpp obj) {
cout <<"Enter no 1: ";
cin >> obj.no_1;
cout <<"Enter no 2: ";
cin >> obj.no_2;
}
int multiply(iluvcpp obj) {
return ((obj.no_2)*(obj.no_1));
}
int main() {
inputno(multi_1);
inputno(multi_2);
cout << multiply(multi_1) <<" "<< multiply(multi_2);
cout << endl;
system("pause");
return 0;
}
答案 0 :(得分:6)
您按值传递对象,这意味着当您致电inputno
时,您正在处理副本。尝试将函数签名更改为:
void inputno(iluvcpp& obj) {
...
}
Here's an explanation,其中包含按值和按引用传递参数的示例。
答案 1 :(得分:1)
2条建议:
默认情况下,类的变量/方法是私有的。如果您熟悉变量,也可以将变量no_1和no_2公开,或者写一个setter。要在默认情况下公开它们,请使用struct而不是class。
正如其他人已经指出的那样,您并未直接修改multi_1和multi_2。要么通过引用传入它们(orip的答案正好提到),要么让它们返回这个iluvcpp obj对象并将它们称为:
multi_1 = inputno(multi_1);
答案 2 :(得分:0)
void inputno(iluvcpp obj)
有一个名为obj
的参数,没有返回值。这是错误的方法,inputno
并不需要main
中的任何内容,但它应该返回一些内容:
iluvcpp inputno(void) { ...
或(等效)iluvcpp inputno() { ...
。
您最后需要return something;
语句,因此C ++知道从inputno
返回的值。