2012-01-31 46 views
11

假設我有這樣的(簡化的)類:這是什麼設計模式?如何使用它?

class Foo_p; 
class Foo 
{ 
private: 
    Foo_p *p; 
public: 
    Foo(); 
    /* methods, etc... */ 
}; 

這個類是API的一部分。 Foo_p是類的所有私有部分,它們不是像往常一樣在類Foo中聲明的 ,而是在一個單獨的前向聲明類中,僅在底層實現中使用,而外部不可見。

我見過這個模式用於幾個項目中,有沒有一個名稱?

另外,如何正確使用它(例如安全等例外)?實際執行到哪裏去?在類Foo中,像往常一樣,只使用Foo_p存儲數據,或者在Foo_p類中使用Foo作爲包裝器?

回答

8

這就是衆所周知的PIMPL。私有/指向私有實現。這個類Foo_p,你的類已經被私人實現並且通過指向它的指針被訪問,所以它們只能看到你選擇公開的公共接口,而不是向客戶端顯示真實的類。它實質上抽象了protectedprivate成員中實現細節的痕跡。我發現在VC++中它很笨拙 - 它破壞了代碼的完成。如果您非常確定您的實施並且不希望privateprotected成員顯示在標題中,這將非常有用。

我把類Foo_p的實際實現放在類Foo的cpp文件中,儘管這可能是導致代碼完成中斷的原因,至少我不必冒這個類被重用的風險包括其標題。

+0

請勿將頭和普通防護級別(公/私)「基本上隱藏實現」? – 2012-01-31 20:31:07

+0

@Matthew:不幸的是,沒有。你必須包含實現頭文件,當他們依賴於例如Windows頭文件時,這些頭文件通常會很不舒服,這些頭文件很糟糕。 – Puppy 2012-01-31 22:41:56

+0

@MatthewFlaschen:是的,但只是在您無法訪問它的意義上,但您在查看代碼時仍然可以*看到它。 – bitmask 2012-01-31 22:42:39

8
+0

感謝您的鏈接! – kralyk 2012-01-31 20:37:41

+0

鏈接已死: – pmb 2013-06-18 15:00:59

+1

@ pmb感謝您的提示,修復了所有三個鏈接_o.O固定鏈接...當他們工作時,他們非常nice_ :( – sehe 2013-06-19 09:38:47

2

這是一個d型指針,它是一種不透明指針。類似於PIMPL的成語。

C++類聲明中常用的一種不透明指針類型是 d指針。 d指針是 類中唯一的私有數據成員,並指向結構的一個實例。由Trolltech的Arnt Gulbrandsen 命名,該方法允許類聲明省略專用 數據成員,除了d指針本身。[6]結果是 更多的類的實現隱藏在視圖中,向私有結構添加新的 數據成員不會影響二進制 兼容性,並且包含類 聲明的頭文件只需要#包括類接口所需的那些其他文件,而不是其實現。作爲一個方面 的好處,編譯速度更快,因爲頭文件經常更改較少 。 d指針在Qt和KDE庫中大量使用。

https://en.wikipedia.org/wiki/Opaque_pointer#C.2B.2B

+0

引用您的來源。 – 2012-01-31 20:33:25