今天小編給大家分享一下C++程序的Pimpl機制怎么實現的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
Pimpl機制是Private Implementation的縮寫,我們常常聽到諸如“不要改動你的公有接口”這樣的建議,所以我們一般都會修改私有接口,但是這會導致包含該頭文件的所有源文件都要重新編譯,這會是個麻煩事兒。Pimpl機制,顧名思義,將實現私有化,力圖使得頭文件對改變不透明。
機制分析
首先,我們先看看不使用這個機制的一個實現:
// MyBase.h class MyBase { public: int foo(); }; // MyDerived.h #include "MyBase.h" class MyDerived : public MyBase { public: int bar(); };假設你現在希望在MyBase.h中加入一個新的private和protected成員函數,那么MyDerived和所有包含MyBase.h的源文件都需要重新編譯。在一個大工程中,這樣的修改可能導致重新編譯時間的激增。你可以使用Doxygen或者SciTools看看頭文件依賴。
一般來說,不在頭文件中包含頭文件是一個比較好的習慣,但是這也不能完全消除修改MyBase.h帶來的重新編譯代價。有沒有一個機制可以使得對私有接口做修改時我們可以減小重新編譯的代價。
在Pimpl機制中,我們使用前置聲明一個Impl類,并將這個類的一個指針實例放入主類中,如下:
// MyClass.h class MyClassImpl; // forward declaration class MyClass { public: MyClass(); ~MyClass(); int foo(); private: MyClassImpl *m_pImpl; };現在,除非我們修改MyClass的公有接口,否則這個頭文件是不會被修改了。然后,我們用這個Impl類的實現來完成主類的細節實現,在主類的構造函數中,我們完成了實現類指針的實例化:
// MyClass.cpp class MyClassImpl { public: int foo() { return bar(); } int bar() { return var++; } int var; }; MyClass::MyClass() : m_pImpl(new MyClassImpl){} MyClass::~MyClass() { try { delete m_pImpl; } catch (...) {} } int MyClass::foo(){ return m_pImpl->foo(); }Pimpl機制其實這是橋接模式的一種變種。我們可以對實現類隨意的進行增刪和修改,而不會導致包含MyClass.h的源代碼重新編譯。當然,這樣做的時間開銷和空間開銷也是有的。
在實踐中,我們常常采用內部類來完成Pimpl機制:
// header class fruit { public: private: class impl; impl* pimpl_; } // implementation class fruit::impl { }; fruit::fruit() { pimpl_ = new impl(); }以上就是“C++程序的Pimpl機制怎么實現”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。