我的部分任务是使用我教授的.cpp文件。在其中,我应该能够处理A = A + B,其中A和B是两个分数。
&Fraction Fraction::operator+(Fraction b)
{
num = (num * b.denom) + (num * denom);///////
denom = (denom * b.denom);
if ((num * denom) >= 0)
{
sign_factor = 1;
}
else
{
sign_factor = -1;
}
num = sign_factor * abs(num);
denom = sign_factor * abs(denom);
num = (num / (static_cast<double>(find_gcd(num, denom))));
denom = (denom / (static_cast<double>(find_gcd(num, denom))));
return this;
}
我的问题是如何返回对象A,以便main.cpp可以执行成员分配(将A + B的结果分配给A)。另外,我在这个函数中引用了num是正确的,还是应该使用a.num。例如,它应该是&#34; a.num = sign_factor * abs(num)还是我没有问题?
非常感谢!!
答案 0 :(得分:0)
这个签名毫无意义:
&Fraction Fraction::operator+(Fraction b)
我不知道您的代码的目的但是在a = a + b
中创建一个带有结果的临时值并返回它可能是有意义的
class Fraction {
public:
Fraction operator+(Fraction b) const // Return a Fraction object
{
Fraction result;
// ... initialize result...
return result;
}
};
如果将num
定义为Fraction
类(或其子类之一)的成员变量,则可以安全地使用它,或者this->num
编辑:
关于你的评论,我添加了一些代码来解释为什么返回临时对象可能更有意义。比较两个版本,并确定哪个版本更适合您的需求。直观地说,第一个是首选和最合乎逻辑的选择。
版本1:返回临时(a
不会被修改)
class Fraction {
public:
Fraction operator+(Fraction& b)
{
Fraction result;
result.num = num + b.num;
return result;
}
void operator=(Fraction& b)
{
num = b.num;
}
int num;
};
int main()
{
Fraction a, b, c;
a.num = 10;
b.num = 20;
c.num = 0;
c = a + b;
// a is now 10
// b is now 20
// c is now 30
}
第2版:返回引用并修改a
class Fraction {
public:
Fraction& operator+(Fraction& b)
{
num = num + b.num;
return *this;
}
void operator=(Fraction& b)
{
num = b.num;
}
int num;
};
int main()
{
Fraction a, b, c;
a.num = 10;
b.num = 20;
c.num = 0;
c = a + b;
// a is now 30 <- I believe you don't want this
// b is now 20
// c is now 30
}