5

私はこのコードにあまりにも長い間取り組んできたと思います。とにかく、ここで何が起こっているのかです。

ヘッダー ファイル (プロジェクトのスコープにより公開の変更が禁止されています)

#ifndef FRACTION_
#define FRACTION_

using namespace std;

#include <iostream>

class Fraction
{
  private:

    int num,denom;


  public:

    // Construct fraction from numerator and denominator
    //
    Fraction( int = 0, int = 1 );

    // Construct fraction by copying existing fraction
    //
    Fraction( const Fraction& );

    // Assign into fraction by copying existing fraction
    //
    Fraction& operator=( const Fraction& );

    // Return true if fraction is valid (non-zero denominator)
    //
    bool IsValid() const;

    // Return value of numerator
    //
    int Numerator() const;

    // Return value of denominator
    //
    int Denominator() const;

    // Input/Output operations
    //
    friend istream& operator>>( istream&, Fraction& );
    friend ostream& operator<<( ostream&, const Fraction& );
};

// Comparative operations
//
bool operator==( const Fraction&, const Fraction& );
bool operator!=( const Fraction&, const Fraction& );
bool operator< ( const Fraction&, const Fraction& );
bool operator<=( const Fraction&, const Fraction& );
bool operator> ( const Fraction&, const Fraction& );
bool operator>=( const Fraction&, const Fraction& );

// Arithmetic operations
//
Fraction operator+( const Fraction&, const Fraction& );
Fraction operator-( const Fraction&, const Fraction& );
Fraction operator*( const Fraction&, const Fraction& );
Fraction operator/( const Fraction&, const Fraction& );

#endif

+ 演算子をオーバーロードしようとしています。そのためのコードは次のとおりです。

Fraction operator+(const Fraction &f1, const Fraction &f2)
{
    return(((f1.num*f2.denom)+(f1.denom*f2.num)),(f1.denom*f2.denom));
}

num と denom をプライベート変数として参照するとエラーが発生します。その問題を修正する方法を理解するのに苦労しています。

4

2 に答える 2

5

Numerator()の代わりにnumとのDenominator()代わりに使用しdenomます。オペレーターはメンバーでも友人でもないため、プライベート メンバーにアクセスすることはできません。

他のオプションは、

  • メンバーにする(ただし、フリー関数にできる演算子をメンバーにすることには、言うことができない5 + frac、だけなど、いくつかの欠点がありますfrac + 5
  • にしますfriend(ただし、そうする必要がないときにフレンドにすることで、インターフェイスを介さずにクラスにアクセスできるものの数が増え、コードのメンテナンスが増加します)
于 2012-10-19T01:07:02.107 に答える
0

この問題を解決するには、少なくとも 4 つの方法があります。

  1. などに変更f1.numf1.Numerator()ます。それがアクセサの目的です。

  2. すべての算術演算子をクラスのフレンドにします。不合理ではありません。

  3. メンバー関数を変更しますoperator+(const Fraction&, const Fraction&)(引数は 1 つしか取りません)。これは時々物事を複雑にし、通常は良いアプローチではありません.

  4. に追加するメンバーoperator+=(const Fraction& rhs)を追加rhs*this、その演算子を使用して非メンバーoperator+(const Fraction& lhs, const Fraction& rhs)を として実装しますreturn Fraction(lhs) += rhs;。これが最も一般的な解決策です。

于 2012-10-19T01:47:20.443 に答える