2014-10-05 124 views
1

以下代碼是Distance類的一部分。運算符重載是一個朋友函數,聲明爲Distance類的私有成員,我嘗試調用的函數是公共成員。此函數不會更改Distance類的成員變量。從朋友函數內的對象訪問成員函數

我試圖保持兩個引用參考對象d1和d2不變,但我的編譯器說我通過調用ConvertToInches函數或位於距離類內的任何函數來違反它們的const屬性,儘管這些函數不改變Distance類中的私有變量。

當我不使d1和d2保持不變時,編譯器沒有問題。

任何人都可以解釋如何讓d1和d2不斷調用這個函數,爲什麼我不工作?

謝謝!

const Distance operator+(const Distance& d1, const Distance d2) 
//this is a friend function 
//declared in private section of Distance class 
{ 
    //this function is what causes problems !!!!!!! 
    d1.ConvertToInches(1, 2, 3, 4); 

    Distance d3 = 3; 
    return d3; 
} 

Distance::ConvertToInches(const int cMiles, const int cYards, const int cFeet, const int cInches) 
//declared in public section of Distance class 
{ 
    cMiles = cMiles * 63360; 
    cYards = cYards *36; 
    cFeet = cFeet * 12; 

    int cSum = cMiles + cYards + cFeet + cInches; 
    return cSum; 
} 
+0

我不知道爲什麼@CIsForCoocckies刪除了答案:根據你的'ConvertToInches'聲明,它是一個非const成員函數。這些可能不會被稱爲'const'對象,例如朋友'operator +'的參數。 – dyp 2014-10-05 01:06:47

+0

或者'ConvertToInches'是一個'static'成員函數嗎? (從你所展示的代碼片段中不清楚)在任何情況下,如果它不訪問任何數據成員或'Distance'的私有成員,那麼沒有理由爲什麼它應該是成員函數,靜態的。 – dyp 2014-10-05 01:12:08

回答

1

的問題是,ConvertToInches方法不聲明爲const,而你試圖調用一個const距離&對象的方法。一個簡單的解決方法是常量添加到聲明和函數的定義:與您的代碼段

class Distance 
{ 
public: 
    int ConvertToInches(const int cMiles, const int cYards, const int cFeet, const int cInches) const; 
}; 

int Distance::ConvertToInches(const int cMiles, const int cYards, const int cFeet, const int cInches) const { /* ... */ } 

另外一個小問題:D2並不像D1 const引用。

+0

謝謝,這是完美的! – 2014-10-05 03:02:03