0

したがって、クラス内演算子のオーバーロードが obj1 + obj2 で機能するようになりました。

fraction operator+ (fraction op);

同様に、cout << obj は、ostream をオーバーロードする演算子をオーバーロードすることによって機能しています。

ostream& operator<< (ostream& os, fraction& frac);

しかし、この 2 つを組み合わせようとすると、地獄が崩壊します。

fraction.cpp:77:27: error: no match for ‘operator<<’ in 
‘std::operator<< [with _Traits = std::char_traits<char>]((* & std::cout), ((const char*)"Sum: ")) 
<< f1.fraction::operator+(f2)’

コードは次のとおりです。

#include <iostream>
using namespace std;

class fraction
{
    private:
        int n, d;

    public:
        fraction ()
        {
            this->n = 1;
            this->d = 0;
        }

        fraction (int n, int d)
        {
            this->n = n;
            this->d = d;
        }

        int getNumerator ()
        {
            return n;
        }

        int getDenominator ()
        {
            return d;
        }

        fraction operator+ (fraction op)
        {
            return *(new fraction(this->n*op.d + op.n*this->d, this->d*op.d));
        }

        fraction operator- (fraction op)
        {

            return *(new fraction(this->n*op.d - op.n*this->d, this->d*op.d));
        }

        fraction operator* (fraction op)
        {
            return *(new fraction(this->n*op.n, this->d*op.d));
        }

        fraction operator/ (fraction op)
        {
            return *(new fraction(this->n*op.d, this->d*op.n));
        }
};

ostream& operator<< (ostream& os, fraction& frac)
{
    int n = frac.getNumerator();
    int d = frac.getDenominator();

    if(d == 0 && n == 0)
        os << "NaN";
    else if(d == 0 && n != 0)
        os << "Inf";
    else if(d == 1)
        os << n;
    else
        os << n << "/" << d;
}

int main ()
{
    fraction f1(2, 3);
    fraction f2(1, 3);

    cout << f1 << " " << f2 << endl;

    /*
    cout << "Sum: " << f1+f2 << endl;
    cout << "Difference: " << f1-f2 << endl;
    cout << "Product: " << f1*f2 << endl;
    cout << "Quotient: " << f1/f2 << endl;
    */

    return 0;
}

ヘルプ。D:

4

1 に答える 1

9

当面の問題は、

ostream& operator<< (ostream& os, fraction& frac)

fracは参照ではないため、一時的なものを受け入れませんconst- に変更します

ostream& operator<< (ostream& os, const fraction& frac)

operator+constbetween two fractions は非参照にバインドできない一時を返します。

これらのケースでは、非常に深刻なメモリ リークもあります。

fraction operator+ (fraction )
{
   return *(new fraction(this->n*op.d + op.n*this->d, this->d*op.d)); 
}

new動的に割り当てられたオブジェクトを返し、それをコピーして関数から返します。

ほとんどの人のようにそれをしてください:

fraction operator+ (const fraction& op) const
{
   return fraction(this->n*op.d + op.n*this->d, this->d*op.d); 
}

(2 つの余分な const と参照渡しに注意してください)

于 2013-07-29T15:22:08.967 に答える