Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 重载组合运算符(+;=,-=,*=和/=)。不';我不知道该怎么做_C++_Oop_Operator Overloading_Fractions_Compound Assignment - Fatal编程技术网

C++ 重载组合运算符(+;=,-=,*=和/=)。不';我不知道该怎么做

C++ 重载组合运算符(+;=,-=,*=和/=)。不';我不知道该怎么做,c++,oop,operator-overloading,fractions,compound-assignment,C++,Oop,Operator Overloading,Fractions,Compound Assignment,代码是更复杂的代码的一部分,但我减少了代码的长度,以查看问题所在的部分。 所以在重载+=、-=、*=和/=运算符之后,结果都是一样的,我不知道我做错了什么。 头文件如下所示: #pragma一次 #包括 使用名称空间std; 类分数 { 受保护的: int a,b;//受保护的属性 公众: 分数()//显式构造函数w-out参数 { a=0; b=1; } 分数(int aa,int bb)//带2个参数的显式构造函数 { if(bb!=0)//调用前检查 a=aa; b=bb; } ~Frac

代码是更复杂的代码的一部分,但我减少了代码的长度,以查看问题所在的部分。 所以在重载+=、-=、*=和/=运算符之后,结果都是一样的,我不知道我做错了什么。 头文件如下所示:

#pragma一次
#包括
使用名称空间std;
类分数
{
受保护的:
int a,b;//受保护的属性
公众:
分数()//显式构造函数w-out参数
{
a=0;
b=1;
}
分数(int aa,int bb)//带2个参数的显式构造函数
{
if(bb!=0)//调用前检查
a=aa;
b=bb;
}
~Fraction()//析构函数
{
a=0;
b=0;
}
void set_a(int-denom=0)//setters
{
a=德南;
}
无效集_b(整数名=1)
{
b=标称值;
}
int get_a()//getter
{
返回a;
}
int get_b()
{
返回b;
}
};
类分数\外部:公共分数//继承的类
{
公众:
分数_ext(intx,inty):分数(x,y){
void simplify()//simplify()func并使用基于差异的算法
{
int c=绝对值(a);
int d=绝对值(b);
while(c!=d)
{
如果(c>d)
c=c-d;
其他的
d=d-c;
}
a/=c;
b/=c;
cout a>>b;
cin>>c>>d;
分数_ext ob1(a,b),ob2(c,d);//为继承的类实例化2个对象
//为结果创建4个其他对象
分数=ob1,dif=ob1,prod=ob1,div=ob1;
ob1.simplify();
ob2.simplify();

cout操作符重载错误,它们创建了一个新的Fraction_ext类型的对象并对其进行了更改,而操作符应更改左侧对象并返回对更改对象的引用

比如说

Fraction_ext & operator +=( const Fraction_ext &F) //overloadng += using member method
{
    this->a += f.b;
    this->simplify();
    return *this;
}
我也怀疑这种说法

this->a += f.b;
加两个分数。检查算法。据我所知,两个分数之和的计算如下

a1   a2   a1 * b2 + a2 * b1 
-- + -- = -----------------
b1   b2        b1 * b2 

这是否回答了您的问题?所有的
运算符\u赋值
运算符都有错误的签名和实现,它们应该修改左操作数并返回对它的引用,而不是创建并返回临时操作数。这并不能解决问题,但在析构函数中将成员设置为
0
是毫无意义的。object正在消失,在析构函数运行之后,没有人能再看到那些成员了。构造函数
分数(intaa,intbb)
当参数
bb
0
时,不会初始化
a
,因此将
0
传递给
bb
会产生一个无意义的对象。非常感谢!现在一切正常!
this->a += f.b;
a1   a2   a1 * b2 + a2 * b1 
-- + -- = -----------------
b1   b2        b1 * b2