2013-05-07 53 views
1
  1. 的是什麼叫「透明類包裝」,在C++
  2. 它爲什麼叫「透明......」
  3. 什麼是它的使用(什麼不能做沒有「透明類包裝」)。

欣賞一些概念性解釋。什麼用C++透明類包裝

回答

0

最有可能的是,你指的是一個輕量級的內聯(頭文件)包裝類,雖然我不熟悉這個術語。像這樣添加抽象級別在允許通用客戶端代碼方面很有用。

+0

這個詞我是從 '谷歌C++風格指南' 了。它說:「我們要求所有單個參數構造函數都是顯式的,而打算成爲其他類的透明包裝的類是例外。」僅供參考http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml?showone=Explicit_Constructors#Explicit_Constructors。所以我好奇什麼是「透明類包裝」 – 2013-05-07 03:58:23

4

透明類包裝器是一個類型的包裝器,其中包裝器的行爲與基礎類型相同 - 因此是「透明的」。

解釋它,以及它的使用,這裏是一個例子,只要它被用來在我們結束了int但超載operator++()輸出消息(由this thread啓發):

class IntWrapper { 
    int data; 
public: 
    IntWrapper& operator++() { 
     std::cout << "++IntWrapper\n"; 
     data++; 
     return *this; 
    } 

    IntWrapper(int i) : data(i) {} 

    IntWrapper& operator=(const IntWrapper& other) 
    { 
     data = other.data; 
     return *this; 
    } 

    bool operator<(const IntWrapper& rhs) const { return data < rhs.data; } 

    // ... other overloads ... 
}; 

然後我們就可以替代用法的intIntWrapper如果我們選擇:

for (int i = 0; i < 100; ++i) { /* ... */ } 
// becomes 
for (IntWrapper i = 0; i < 100; ++i) { /* ... */ } 

除了後者將打印時前增量被稱爲消息。

請注意,我提供了一個非顯式構造函數IntWrapper(int i)。這可以確保,無論何時我使用int(其中IntWrapper是預期的)(例如IntWrapper i = 0),編譯器都可以靜默地使用構造函數在int之外創建IntWrapper。正是出於這個原因,Google C++風格指南不鼓勵使用單參數的非顯式構造函數,因爲可能會出現您不期望的轉換,這會損害類型安全性。另一方面,這正是你想要的透明類包裝器,因爲你確實希望這兩種類型可以很容易地轉換。

即:

// ... 
explicit IntWrapper(int i) ... 
// ... 
IntWrapper i = 0; // this will now cause a compile error