2011-04-22 51 views
4

我有一個自定義類,它充當一個名爲Integer的int,我想告訴編譯器如何自動將某些類型轉換爲Integer,這樣我就可以避免一次又一次地輸入相同的東西,從內置類型到自定義類的轉換

someCall(Integer(1), Integer(2)); 

將成爲

someCall(1,2); 

我GOOGLE了,但所有我能找到的就是做oposite,鑄造整數爲int我想完成相反。

回答

14

寫一個構造函數int,如:

class Integer 
{ 
    public: 
     Integer(int); 
}; 

如果該類Integer有此構造,那麼你可以這樣做:

void f(Integer); 

f(Integer(1)); //okay 
f(1);   //this is also okay! 

的解釋是,當你寫f(1),那麼Integer的構造函數會自動調用一個類型爲int的單參數,並創建一個臨時的動態,然後該臨時被傳遞給函數上!


現在假設你想要做的完全相反,即,通過Integer類型的對象給一個函數需要int

void g(int); //NOTE: this takes int! 

Integer intObj(1); 
g(intObj); //passing an object of type Integer? 

爲了讓上面的代碼工作,你需要的是在類作爲定義一個用戶定義的轉換函數:

class Integer 
{ 
    int value; 
    public: 
     Integer(int); 
     operator int() { return value; } //conversion function! 
}; 

因此,當你經過Integer類型的一個目的是這需要01的功能,然後轉換函數被調用,並且對象隱含轉換爲int然後傳遞給函數作爲參數。你也可以這樣做:

int i = intObj; //implicitly converts into int 
       //thanks to the conversion function! 
+0

理論上,應該轉換爲'INT&'和'const int的&',我認爲。 – Puppy 2011-04-22 14:49:39

+0

納瓦茲你建議的作品,但我有回報(n <2)? 1:IntegerFromACall;這給了我,錯誤:操作數爲?:有不同的類型'int'和'Integer' – 2011-04-22 15:07:05

+0

@Hamza:寫這個:'return(n <2)? 1:(int)IntegerFromACall;'...這將工作! – Nawaz 2011-04-22 15:10:57

5

你可以定義Integer中的構造函數,用於你想要隱式轉換的類型。不要讓他們explicit

4

納瓦茲給出了正確的答案。我只想指出一些。 如果轉換操作不是const的,你不能轉換const對象變成

const Integer n(5); 
int i = n; // error because non-const conversion operator cannot be called 

更好的聲明轉換運算符,

operator int() const {return value;} 
+0

+1好點。我喜歡它。 :-) – Nawaz 2011-04-22 14:48:49

相關問題