新聞中心
Pimpl機制是Private Implementation的縮寫,我們常常聽到諸如“不要改動你的公有接口”這樣的建議,所以我們一般都會修改私有接口,但是這會導致包含該頭文件的所有源文件都要重新編譯,這會是個麻煩事兒。Pimpl機制,顧名思義,將實現(xiàn)私有化,力圖使得頭文件對改變不透明。

成都創(chuàng)新互聯(lián)成立于2013年,我們提供高端網(wǎng)站建設(shè)公司、成都網(wǎng)站制作、成都網(wǎng)站設(shè)計、網(wǎng)站定制、全網(wǎng)營銷推廣、成都小程序開發(fā)、微信公眾號開發(fā)、營銷推廣服務,提供專業(yè)營銷思路、內(nèi)容策劃、視覺設(shè)計、程序開發(fā)來完成項目落地,為成都陽臺護欄企業(yè)提供源源不斷的流量和訂單咨詢。
機制分析
首先,我們先看看不使用這個機制的一個實現(xiàn):
- // MyBase.h
- class MyBase {
- public:
- int foo();
- };
- // MyDerived.h
- #include "MyBase.h"
- class MyDerived : public MyBase {
- public:
- int bar();
- };
假設(shè)你現(xiàn)在希望在MyBase.h中加入一個新的private和protected成員函數(shù),那么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;
- };
現(xiàn)在,除非我們修改MyClass的公有接口,否則這個頭文件是不會被修改了。然后,我們用這個Impl類的實現(xiàn)來完成主類的細節(jié)實現(xiàn),在主類的構(gòu)造函數(shù)中,我們完成了實現(xiàn)類指針的實例化:
- // 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機制其實這是橋接模式的一種變種。我們可以對實現(xiàn)類隨意的進行增刪和修改,而不會導致包含MyClass.h的源代碼重新編譯。當然,這樣做的時間開銷和空間開銷也是有的。
在實踐中,我們常常采用內(nèi)部類來完成Pimpl機制:
- // header
- class fruit
- {
- public:
- private:
- class impl;
- impl* pimpl_;
- }
- // implementation
- class fruit::impl
- {
- };
- fruit::fruit()
- {
- pimpl_ = new impl();
- }
希望看后本文,你會有收獲。
【編輯推薦】
- C/C++是程序員必須掌握的語言嗎?
- C/C++返回內(nèi)部靜態(tài)成員的陷阱
- C++三則 如無必要 勿增虛函數(shù)
- 淺談怎樣加快C++代碼的編譯速度
- C++連接mysql數(shù)據(jù)庫的兩種方法
文章題目:C++程序的設(shè)計機制2Pimpl機制
文章來源:http://m.fisionsoft.com.cn/article/dpgcssd.html


咨詢
建站咨詢
