天天看點

【C++程式設計技巧】Pimpl機制

1.簡介

這個機制是Private Implementation的縮寫,我們常常聽到諸如“不要改動你的公有接口”這樣的建議,是以我們一般都會修改私有接口,但是這會導緻包含該頭檔案的所有源檔案都要重新編譯,這會是個麻煩事兒。Pimpl機制,顧名思義,将實作私有化,力圖使得頭檔案對改變不透明。

2.機制分析

首先,我們先看看不使用這個機制的一個實作:

假設你現在希望在MyBase.h中加入一個新的private和protected成員函數,那麼MyDerived和所有包含MyBase.h的源檔案都需要重新編譯。在一個大工程中,這樣的修改可能導緻重新編譯時間的激增。你可以使用Doxygen或者SciTools看看頭檔案依賴。

一般來說,不在頭檔案中包含頭檔案是一個比較好的習慣,但是這也不能完全消除修改MyBase.h帶來的重新編譯代價。有沒有一個機制可以使得對私有接口做修改時我們可以減小重新編譯的代價。

在Pimpl機制中,我們使用前置聲明一個Impl類,并将這個類的一個指針執行個體放入主類中,如下:

現在,除非我們修改MyClass的公有接口,否則這個頭檔案是不會被修改了。然後,我們用這個Impl類的實作來完成主類的細節實作,在主類的構造函數中,我們完成了實作類指針的執行個體化:

在實踐中,我們常常采用内部類來完成Pimpl機制:

繼續閱讀