2017-04-06 75 views
0

我正在寫一類是這樣的:超負荷運營商=在C兩個參數++

class Digit 
{ 
    private : 
     int *ref; 
    public : 
     Digit (int a) : ref(&a) {} 
     int get_val() 
     { 
      return (*ref); 
     } 
     Digit operator= (int &a) 
     { 
      if (a < 0 || a > 9) 
       throw "invalid digit assignment."; 
      (*ref) = a; 
      return (*this); 
     } 
    }; 

所以,如果有人定義了一個數字,他不能將超過9或低於0到它的價值。 問題是,我還想定義另一個=運算符,他也可以將一個數字分配給某個值。 我想是這樣的:

int operator= (int &a, Digit &d) 
{ 
    a = d.get_value(); 
    return a; 
} 

,但我得到了一些錯誤:'int operator=(int&, Digit&)' must be a nonstatic member function

我怎樣才能解決這一問題?我如何重載operator = 2個參數?

+1

爲什麼'ref'是*指針*? (只要構造函數返回,它也是無效的。) – molbdnilo

+4

不要想「如何重載賦值運算符」,請考慮「我怎樣才能隱式地將'Digit'轉換爲'int'」。 – molbdnilo

+0

@molbdnilo我不得不用[]運算符編寫一個返回數字的類,以便我們可以使用它:a [10] = 5; (和一些成員變更爲5.) – iambb5445

回答

3

你真的什麼需要可能是operator int()

class Digit { 
    operator int() { return get_val(); } 
}; 

然後,你可以寫int a = d;假設dclass Digit

+0

這將解決當前的問題,但只要程序變得越來越複雜,'int'和'Digit'被傳遞並返回,鑄造操作員就更加頭痛。可能會出現「無聲」的轉換,您最不希望發生這種轉變。 – PaulMcKenzie

+2

@PaulMcKenzie可以通過將操作符設爲'explicit'來解決。 – NathanOliver

+0

非常感謝!這解決了我的問題。 – iambb5445

0

我認爲你正在試圖獲得數字的值作爲一個整數,如果我理解正確。

您不打算使用operator =,因爲operator =用於指定這個類。你想從類中提取一個值。

你的方法:

int get_val() 
{ 
    return (*ref); 
} 

已經這樣做了。但是,它應該是

int get_val() const 
{ 
    return (*ref); 
} 

因爲它不會更改任何類成員的值。

用法是:

int main() 
{ 
    Digit digit(5); 
    int myInt = digit.get_value(); 
    return 0; 
} 

如果你想隱式數字轉換爲int,你可以使用

operator int() 
{ 
    return get_val(); 
} 

這僅僅是一個捷徑。如果沒有運營商,你會做這樣的事情:

#include <iostream> 

void Print(int x) 
{ 
    std::cout << x << std::endl; 
} 

int main() 
{ 
    Digit digit(5); 
    Print(digit.get_value()); 

    return 0; 
} 

,但與運營商,你告訴像int編譯器的數字類可處理(轉換):

#include <iostream> 

void Print(int x) 
{ 
    std::cout << x << std::endl; 
} 

int main() 
{ 
    Digit digit(5); 
    Print(digit); 

    return 0; 
} 
+0

我在寫一個頭文件,而其他人正在寫主函數。 – iambb5445