2011-07-31 17 views
1

我知道了平普爾 - 成語,在C將是這個樣子:鑄字結構隱藏實現VS平普爾 - 成語

// foobar.h 
struct FooBar { 
    char *someString; 
    struct FooBarImpl *pImpl; 
}; 
// foobar.c 
struct FooBarImpl { 
    char *hiddenString; 
}; 
類型轉換

但是我可以擺脫不透明的指針,降低了賠率有人食堂與實施:

// foobar.h 
struct FooBar { 
    char *someString 
}; 
// foobar.c 
struct FooBarImpl { 
    // FooBar members 
    char *someString 
    // FooBarImpl members 
    char *hiddenString 
}; 

在後一種情況下,任何功能上做FooBar的操作只會強制轉換爲FooBarImpl獲得訪問「私人」的成員。

我可以看到這將成爲一個問題,例如,如果某人將某個成員添加到FooBar但不對FooBarImpl執行相同操作。但在我的情況下,FooBar將只包含一個成員,並且不會發生變化。

這是否被認爲是好的做法,或者我應該堅持使用pimpl-idiom當我想隱藏實現細節?

謝謝。

回答

2

編譯器是你的朋友;請勿使用明確的類型轉換,特別是在複合類型之間作弊。堅持第一種方法,如果你轉發 - 聲明實現結構,你永遠不必泄露它的內容。

0

你將不得不使用代碼結構之間的類型轉換工作時要非常小心:

  1. 你無法創建FooBar的陣列或該陣列的客戶端代碼提供指針。
  2. 指定或memcpy:結構(不是指針)需要分配FooBarImpl而不是FooBar - 否則將切斷實現特定的數據。
  3. 從標題看,庫的用戶可能會錯誤地認爲memcpying或賦值或創建FooBar結構是正確的 - 畢竟,它似乎包含的所有基本數據都可以輕鬆填充。