在这个上下文c ++中出错

时间:2012-10-19 01:05:29

标签: c++

我想我一直在研究这段代码。无论如何,这里发生了什么。

头文件(项目范围禁止更改公共)

#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作为私有变量的错误,我只是很难弄清楚如何纠正这个问题。

2 个答案:

答案 0 :(得分:5)

使用Numerator()代替numDenominator()代替denom。您的运营商不是会员,也不是朋友,因此无法访问私人会员。

另一种选择是

  • 使其成为成员(但是,使成员可以成为免费功能的运算符有几个缺点,包括您不能说5 + frac,只有frac + 5
  • 使它成为friend,(但如果不必通过其界面增加有权访问该类的内容的数量,则可以使其成为朋友,从而增加代码维护)

答案 1 :(得分:0)

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

  1. f1.num更改为f1.Numerator()等;这就是访问者的用途。

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

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

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