1

私は C++ の初心者です (私は人生のすべてを C で過ごしてきたので、知識を豊かにするために新しい言語を学ぶことに時間を投資する時が来たと思いました :))。「Rational」という名前のクラスがあり、ゲッター、セッター、コンストラクターなどの特定の関数がすべてあります (ここでは関係ありません)。興味深い部分は、+、-、、/ 演算子をオーバーロードしようとするときです。Rational a(1,5),b(5,5),c; などの 2 つの Rational オブジェクト間でこれを正常に実行できます。c = a + b; したがって、これはすべて正常に機能します。今、Rational と整数の間で+,-, ,/ を試して、クラスをアップグレードしようとしています。

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;
    }
...

Rational.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’

この作業を行うにはどうすればよいですか? ありがとう!

4

1 に答える 1

3

tl;dr:

演算子は次のように宣言する必要があります。

Rational operator+(const Rational& B) const;

ええと...少なくともこれらのもの。operator =への参照を返す必要がありますが*this、それはこの質問の範囲外です。また、これらの演算子はRationalオブジェクトで機能するように定義されていますが、

r1 = 1 + demi; 

intおよびオブジェクトを操作しようとしRationalます。クラスの外で適切な演算子を定義する必要があります。

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

ただし、良い本で C++ の学習を開始することをお勧めします。あちこちから物を拾うだけでは、実際にはうまくいきません。

于 2012-11-28T23:14:51.940 に答える