2015-02-06 52 views
0

我在写一个bignum实现,并在其中重载了运算符+和=。这里是我的代码,做它:Overloading =在bignum实现中

BigNum& operator+(const BigNum& b) { 
    BigNum sum; 
    int carry=0; 
    for (int i=0; i<N;i++){ 
     sum.dig[i]=(dig[i]+b.dig[i]+carry)%10; 
     carry=(dig[i]+b.dig[i]+carry)/10; 
    } 
    return sum; 
} 

BigNum& operator=(const BigNum& rhs) { 
    for (int i=0; i<N; i++){ 
     dig[i]=rhs.dig[i]; 
    } 
    return *this; 
} 

他们似乎都对自己的运作良好(我可以正确地分配BIGNUM到BIGNUM正确添加两个大数),但是当我试图将它们结合起来,我得到似乎是随机的答案。因此,如果A和B都是大数,没关系,如果我说

BigNum c=b; 

cout<<a+b; 

a=a+b; 

给出了一个意想不到的结果。

+0

什么是'dig'?它是如何定义的?你能给我们一些具体的例子输入和输出吗? – 2015-02-06 03:24:34

回答

1

您正在从+运算符返回对本地变量sum的引用。你不能有意义地返回引用或指向局部变量的指针。由于这个错误,你的代码的行为是不确定的,这是你“意想不到的结果”的原因。

既然要实现一个标准二进制+,您必须通过价值

BigNum operator +(const BigNum& b) const { 
    BigNum sum; 
    ... 
    return sum; 
} 

返回结果作为附加的注释,二进制+更有意义,作为一个独立的(可能是朋友)功能,不作为班级成员。如果你想保持它作为一个班级成员,至少要宣布它const(见上文)。

另一个问题是什么是什么N是什么以及您的班级是否违反了三条规则。但是从你发布的内容来说是不可能的。

+0

我不明白这与我的代码有什么不同,除了声明为const,它不能解决问题。你能详细说明一下吗? – user132290 2015-02-06 03:30:00

+1

@ user132290:返回类型是'BigNum',而不是你的'BigNum&'。如果你想用C++编程,你必须学会​​看到这样的小东西。 – AnT 2015-02-06 03:30:53

+0

确实很好。可悲的是编译器应该在没有我们需要查看的情况下发现这个问题。可能OP没有完全启用警告和错误。他/她应该尽快做到这一点。 – 2015-02-06 07:22:09

0

这可能不会回答你的问题,但我相信它会改善你的代码,因此这是一个“建议”。

实施+运算符来创建调用+ =运算符的临时数据是明智的。

例如:

BigNum& operator += (const BigNum &other) { 
    int carry = 0; 
    for (int i = 0; i < digits_length; ++i) { 
     int temp = digit[i]; 
     digit[i] = (digit[i] + other.digit[i] + carry) % 10; 
     carry = (temp + other.digit[i] + carry)/10; 
    } 
    return *this; 
} 

BigNum operator + (const BigNum& other) const { 
    return BigNum(*this) += other; 
}