在C++中扩展操作员过载

extending operator overload in C++

本文关键字:操作员 扩展操作 扩展 C++      更新时间:2023-10-16

我对C++相当陌生(我一生都在C语言中度过,所以我认为是时候花一些时间来学习一门新语言,以丰富我的知识:))。我有一个名为"Rational"的类,我有它的所有特定函数,用于getter,setter,constructor等(这里无关紧要)。有趣的是,当我尝试重载 +,-,,/运算符时。我能够在两个理性对象之间成功地做到这一点,例如理性 a(1,5)、b(5,5)、c;c = a + b;所以这一切都很好。现在我正在尝试通过在 Rational 和整数之间 +,-,,/来升级我的类,例如 2 + a、10 - b 等。以下是我在 Rationals 之间重载的代码片段:

Rational.cc

...
    Rational Rational::operator+(Rational B) {
            int Num;
            int Den;
            Num = p * B.q + q * B.p;
            Den = q * B.q;
            Rational C(Num, Den);
            C.simplifierFraction();
            return C;
    }
    Rational Rational::operator-(Rational B) {
            int Num;
            int Den;        
            Num = p * B.q - q * B.p;
            Den = q * B.q;
            Rational C(Num, Den);
            C.simplifierFraction();
            return C;
    }

    Rational Rational::operator*(Rational B) 
    {
            int Num;
            int Den;
            Num = p * B.p;
            Den = q * B.q;
            Rational C(Num, Den);
            C.simplifierFraction();
            return C;
    }
    Rational Rational::operator/(Rational B) 
    {
            int Num;
            int Den;
            Rational invB = inverse(B);
            Num = p * invB.p;
            Den = q * invB.q;
            Rational C(Num, Den);
            C.simplifierFraction();
            return C;
    }
...

理性.h

    Rational operator+(Rational B);
    Rational operator-(Rational B);
    Rational operator*(Rational B);
    Rational operator/(Rational B);

private:
    int p;
    int q;
protected:

TestRat.cc

int main() {
...
    const Rational demi(1,2);      
    const Rational tiers(1,3);      
    const Rational quart(1,4);
    r0 = demi + tiers - quart;         
    r1 = 1 + demi;                     
    r2 = 2 - tiers;                    
    r3 = 3 * quart;                    
    r4 = 1 / r0;
...  

因此,当我尝试运行 TestRat.cc 时,它说:

testrat.cc:31: error: no match for ‘operator+’ in ‘1 + r9’
testrat.cc:52: error: passing ‘const Rational’ as ‘this’ argument of ‘Rational Rational::operator+(Rational)’ discards qualifiers
testrat.cc:53: error: no match for ‘operator+’ in ‘1 + demi’
testrat.cc:54: error: no match for ‘operator-’ in ‘2 - tiers’
testrat.cc:55: error: no match for ‘operator*’ in ‘3 * quart’
testrat.cc:56: error: no match for ‘operator/’ in ‘1 / r0’

我必须做什么才能完成这项工作?谢谢!

tl;dr:

您的运算符应声明为:

Rational operator+(const Rational& B) const;

井。。。至少这些。 operator =应该返回对*this的引用,但这超出了本问题的范围。此外,这些运算符被定义为处理Rational对象,而

r1 = 1 + demi; 

尝试对intRational对象进行操作。您必须在类外部定义一个适当的运算符:

inline Rational operator+(int, const Rational& r)
{
    //...
}

不过,我建议你从一本好书开始学习C++。只是从这里和那里捡东西是行不通的。