2012-04-08 53 views
0

我有一個類,其唯一的數據成員是一個32位無符號整數。也就是說,類看起來是這樣的:從常量用戶定義的類轉換爲C++中的內建類型

class A { 
protected: 
    unsigned int bits; 
    /* ... some methods ... */ 
public: 
    /* ... some methods ... */ 
}; 

但我希望它也能隱式轉換和從32位無符號整數。所以,我在一個拷貝構造函數增加以及鑄造操作:

class A { 
protected: 
    unsigned int bits; 
    /* ... some methods ... */ 
public: 
    A(): bits(0) {} // default constructor 
    A(const unsigned int i): bits(i) {} // convert from unsigned int to A 
    operator unsigned int() { return bits; } // convert from A to unsigned int 
    /* ... some methods ... */ 
}; 

所以現在例如,我可以做以下的事情:

int main() { 
    // default constructor 
    A a0 = A(); 
    // convert from unsigned int 
    A a1 = 1 + 2; 
    // conversions between the two types: 
    unsigned int result = (a0 & a1 + 5)/2; 
} 

但是我努力得到它的工作與const類型。具體而言,以下不工作:

int main() { 
    const A a = 5;  // works 
    unsigned int i = a; // compiletime error 
} 

它說:「沒有合適的轉換函數從‘常量A’到‘無符號整數’存在。」我使用Microsoft提供的默認編譯器使用Visual Studio 2010。

我需要創建什麼轉換函數才能正常工作?

+0

回覆:「但我希望它也能夠隱式轉換爲32位無符號整數。」小心你要求的東西。隱式轉換會讓你在最後期望的時候遇到困難,而有經驗的C++程序員通常會避免允許在類中進行隱式轉換,除非在少數情況下。通過允許類「A」的這種隱式轉換,您認爲您會獲得什麼好處? – 2012-04-08 03:48:22

+0

@Insilico:更清晰的代碼,因爲當我對位執行操作時,我無需在任何地方寫劇集。 – Cam 2012-04-08 03:49:50

+0

使用公共方法或運算符重載來實現這些位操作是不夠的? – 2012-04-08 03:51:01

回答

3

聲明轉換操作符常量:

operator unsigned int() const { return bits; } 

警告:隱式轉換運營商幾乎總是一個壞主意。危險通常遠大於調用一個普通的老成員函數的小麻煩:

unsigned int asInt() const { return bits; } 
⋮ 
unsigned int i = a.asInt(); 

的最終解決方案,如果你有C++ 11,正在申報的明確轉換操作符:

explicit operator unsigned int() const { return bits; } 
⋮ 
unsigned int i = static_cast<int>(a); 
+1

謝謝!說得通。我會在時限後接受你的回答,但是你能否詳細說明爲什麼這麼危險? – Cam 2012-04-08 03:52:10

+0

關於顯式轉換運算符 - 非常酷,但如果我這樣做,我必須每次在A對象上使用unsigned int運算符之一時調用'static_cast',我寧願不這樣做。您能否詳細瞭解在這種情況下允許這種隱式轉換的危險性? – Cam 2012-04-08 03:56:27

+0

@Cam:它不是令人難以置信的危險,只是簡單的香草危險,而另一種方式就是這樣一個小的拼版,它通常不值得冒險。你不應該爲了方便而從事安全交易。 – 2012-04-08 03:57:09