C++ 类型为&;的非常量引用的初始化无效;int型右值的分数? #包括 #包括 使用名称空间std; 使用名称空间rel_ops; 类分数 { 私人: //用于存储分子和分母的变量 int-num; int-denom; 公众: 分数(){} 分数(int num):num(num){} 分数(intnum,intdenom):num(num),denom(denom){ 无效集_num(int n){num=n;} 无效集_denom(int d){denom=d;} int get_numerator()常量{return num;} int get_分母()常量{return denom;} 分数和运算符+=(常数分数和对象){ if(denom==obj.denom){ 返回num+obj.num; } } }; //计算最高公分母 int g_c_d(int n,int d){ 返回d==0?n:g_c_d(d,n%d); } istream和运算符>>(istream和输入、分数和f) { int n,d; 字符斜杠; 输入>>n; 输入>>斜杠; 输入>>d; 如果(d==0){n=0;}//如果denom为0;分数=0/0 f=分数(n,d); 返回输入; } ostream&operator
您的C++ 类型为&;的非常量引用的初始化无效;int型右值的分数? #包括 #包括 使用名称空间std; 使用名称空间rel_ops; 类分数 { 私人: //用于存储分子和分母的变量 int-num; int-denom; 公众: 分数(){} 分数(int num):num(num){} 分数(intnum,intdenom):num(num),denom(denom){ 无效集_num(int n){num=n;} 无效集_denom(int d){denom=d;} int get_numerator()常量{return num;} int get_分母()常量{return denom;} 分数和运算符+=(常数分数和对象){ if(denom==obj.denom){ 返回num+obj.num; } } }; //计算最高公分母 int g_c_d(int n,int d){ 返回d==0?n:g_c_d(d,n%d); } istream和运算符>>(istream和输入、分数和f) { int n,d; 字符斜杠; 输入>>n; 输入>>斜杠; 输入>>d; 如果(d==0){n=0;}//如果denom为0;分数=0/0 f=分数(n,d); 返回输入; } ostream&operator,c++,pointers,error-handling,C++,Pointers,Error Handling,您的operator+=返回一个临时值,它应该类似于: #include <iostream> #include <utility> using namespace std; using namespace rel_ops; class Fraction { private: //variables to store numerator and denominator int num; int denom; public: Fraction(){}
operator+=
返回一个临时值,它应该类似于:
#include <iostream>
#include <utility>
using namespace std;
using namespace rel_ops;
class Fraction
{
private:
//variables to store numerator and denominator
int num;
int denom;
public:
Fraction(){}
Fraction(int num): num(num) {}
Fraction(int num, int denom): num(num), denom(denom) {}
void set_num(int n){ num = n;}
void set_denom(int d){ denom = d;}
int get_numerator() const {return num;}
int get_denominator() const {return denom;}
Fraction &operator+= (const Fraction &obj){
if (denom == obj.denom){
return num + obj.num;
}
}
};
//calculating highest common denominator
int g_c_d(int n, int d){
return d == 0? n : g_c_d(d, n % d);
}
istream &operator>> (istream &input, Fraction &f)
{
int n, d;
char slash;
input >> n;
input >> slash;
input >> d;
if (d == 0) {n = 0;} //if denom is 0; fraction = 0/0
f = Fraction(n, d);
return input;
}
ostream &operator<<(ostream &output, const Fraction &frac)
{
return output << frac.get_numerator() << "/" << frac.get_denominator();
}
int main()
{
int n, d;
Fraction frac;
Fraction frac1(3,4);
Fraction frac2(4,4);
cout << frac1 << " + " << frac2 << " = ";
cout << (frac1 += frac2) << endl;
cout << "Enter a fraction" << endl;
cin >> frac; //user inputs fraction
n = frac.get_numerator(); //get users numerator
d = frac.get_denominator(); //get users denominator
gcd = g_c_d(frac.get_numerator() , frac.get_denominator()); //calculate gcd of fraction using users input
//set new simplified values for the users fraction
frac.set_num(n/gcd);
frac.set_denom(d/gcd);
cout << "your fraction is: ";
cout << frac << endl;
return 0;
}
这个函数有几个地方出了问题。如果
denom!=目标名称
<代码>+=意味着应该更改对象,但这不会发生num+obj.num
生成一个临时对象,您不能返回对临时对象的引用。如果函数中的条件为false,您将返回什么?
Fraction &operator+= (const Fraction &obj){
if (denom == obj.denom){
num += obj.num;
} else {
// you have also to do that part
}
return *this; // return this object, not a temporary
}