2012-10-19 28 views
3

我想我一直在這個代碼太長。無論如何,這是發生了什麼。在這種情況下私人的錯誤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作爲私有變量,我只是很難找出如何糾正這個問題。

回答

5

使用Numerator()而不是numDenominator()而不是denom。您的運營商不是會員,也不是朋友,因此無法訪問私人會員。

另一種選擇將是

  • 使它成爲成員(但製作經營者,可以是一個免費的功能的部件有幾個缺點,其中包括你不能說5 + frac,只有frac + 5
  • 使其成爲friend,(但做它時,它不一定是朋友增加了東西,有機會獲得該類不通過其接口的數量,從而增加代碼維護)
+0

這很有道理,感謝您的幫助 – sharkman

+0

+1非常完整的答案 – sehe

+0

@sehe,感謝您的編輯。它更可讀。 – chris

0

有解決這個問題至少在四個方面:

  1. 變化f1.numf1.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;。這是最一般的解決方案。