2013-08-16 64 views
1

我正在爲我的項目做一個小理性類,並且我重載了所有的aritmethic操作符。那麼,當我嘗試重載operator =我有一個小的,現在我不知道是我的問題(我不知道它是如何工作的)或我wroten代碼的問題(我寫它壞)這裏是代碼:operator = in C++(11)工作方向

class rational{ 

    public: 
     double& operator=(double& d){ 
     d= this->num/this->den; 
     return d; 
     } 
     double& operator=(rational& r){ 
      double d= r.num/r.den; 
      return d; 
     } 
     double& operator=(){ 
      double d= this->num/this->den; 
      return d; 
     } 
} 

好吧,有什麼不對?什麼是對的? (我認爲這一切都是錯的,哈哈)

我的目標是做到這一點:

int main(){ 
    rational r(4, 5); 
    double d= r; 
} 

我能做到嗎?如果是的話,怎麼樣?

+3

你向我們展示整個類或只是其中的一部分?如果它是整個事情,你需要定義一個構造函數,它需要2個雙打,而不是賦值操作符來讓你的例子編譯。另外,典型的'operator ='實現返回對同一個類實例的引用,而不是對輸入參數的引用。 – Praetorian

+1

我想你正在尋找'operator double'。 – chris

+0

謝謝!我不知道存在操作符double ...謝謝!那麼......我可以重載「所有」類型的操作符嗎?我不知道那個感謝所有的答案! – DrkDeveloper

回答

3

您不希望賦值運算符用於此目的 - 您應該重載轉換運算符;例如

class rational { 
    private: 
    int num; 
    int den; 

    public: 
    // ... 
    operator double() { return double(num)/double(den); } 
}; 

這將使

rational r(4, 5); 
double d = double(r); // d = 0.8 

賦值運算符應該用於更改現有對象的狀態,如果這就是你要允許某。你可能不希望允許將一個double賦給一個理性,這樣的操作沒有明確的含義。但是,您可能要分配一個int提供幫手,說,除了通常的一個分配另一個理性:

rational &operator=(const rational &rhs) 
{ 
    num = rhs.num; 
    den = rhs.den; 
    return *this; 
} 

rational &operator=(int rhs) 
{ 
    num = rhs; 
    den = 1; 
    return *this; 
} 
+0

謝謝,如果您沒有任何老師,找到操作員的工作方式太困難了...這對我很有用謝謝! – DrkDeveloper

+0

@ user2688108這個答案是否足夠?如果是這樣,請考慮接受它。 – sfjac

2

在這裏,我想一個user-defined conversion operator會更合適。

class rational { 
public: 
    rational(int iNum, int iDen) : num(iNum), den(iDen) {} 

    // ... 
    operator double() { return (double)num/(double)den; } 

private: 
    int num; 
    int den; 
}; 

int main() 
{ 
    rational r(1, 2); 
    double n = r; 

    std::cout << r << std::endl; // output 0.5 
    return 0; 
} 

這裏是一個小活的例子來說明這一點:http://ideone.com/I0Oj66


關於拷貝賦值operator=

T類的拷貝賦值運算符是一個非模板非靜態成員函數,名稱operator=只需要一個012類型的參數。

operator=用於更改現有對象。

您可以使用它,例如向國家複製另一個對象:

rational &operator=(const rational &rhs) 
{ 
    num = rhs.num; 
    den = rhs.den; 
    return *this; 
} 
+0

謝謝!我爲所有人重申!謝謝!那是我想達到的目標 – DrkDeveloper