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()代替numDenominator()代替denom。您的运营商不是会员,也不是朋友,因此无法访问私人会员。

另一种选择是

  • 使其成为成员(但使可以成为自由函数的运算符成为成员有几个缺点,包括你不能说5 + frac, only frac + 5
  • 使其成为friend, (但是当它不必成为朋友时会增加不通过其接口访问该类的事物的数量,从而导致代码维护增加)
于 2012-10-19T01:07:02.107 回答
0

至少有四种方法可以解决这个问题:

  1. 更改f1.numf1.Numerator()等;这就是访问器的用途。

  2. 让所有算术运算符成为班级的朋友。不无道理。

  3. 更改您operator+(const Fraction&, const Fraction&)的 a 成员函数(然后只接受一个参数);这有时会使事情复杂化,而我们通常不是一个好方法。

  4. 添加一个operator+=(const Fraction& rhs)添加rhs到的成员*this,然后使用该运算符将您的非成员实现operator+(const Fraction& lhs, const Fraction& rhs)return Fraction(lhs) += rhs;。这是最通用的解决方案。

于 2012-10-19T01:47:20.443 回答