日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
C++程序的設(shè)計(jì)機(jī)制2Pimpl機(jī)制

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

成都創(chuàng)新互聯(lián)成立于2013年,我們提供高端網(wǎng)站建設(shè)公司、成都網(wǎng)站制作成都網(wǎng)站設(shè)計(jì)、網(wǎng)站定制、全網(wǎng)營銷推廣、成都小程序開發(fā)、微信公眾號(hào)開發(fā)、營銷推廣服務(wù),提供專業(yè)營銷思路、內(nèi)容策劃、視覺設(shè)計(jì)、程序開發(fā)來完成項(xiàng)目落地,為成都陽臺(tái)護(hù)欄企業(yè)提供源源不斷的流量和訂單咨詢。

機(jī)制分析

首先,我們先看看不使用這個(gè)機(jī)制的一個(gè)實(shí)現(xiàn):

 
 
 
  1. // MyBase.h  
  2. class MyBase {  
  3. public:  
  4. int foo();  
  5. };  
  6. // MyDerived.h  
  7. #include "MyBase.h"  
  8. class MyDerived : public MyBase {  
  9. public:  
  10. int bar();  
  11. }; 

假設(shè)你現(xiàn)在希望在MyBase.h中加入一個(gè)新的private和protected成員函數(shù),那么MyDerived和所有包含MyBase.h的源文件都需要重新編譯。在一個(gè)大工程中,這樣的修改可能導(dǎo)致重新編譯時(shí)間的激增。你可以使用Doxygen或者SciTools看看頭文件依賴。

一般來說,不在頭文件中包含頭文件是一個(gè)比較好的習(xí)慣,但是這也不能完全消除修改MyBase.h帶來的重新編譯代價(jià)。有沒有一個(gè)機(jī)制可以使得對私有接口做修改時(shí)我們可以減小重新編譯的代價(jià)。

在Pimpl機(jī)制中,我們使用前置聲明一個(gè)Impl類,并將這個(gè)類的一個(gè)指針實(shí)例放入主類中,如下:

 
 
 
  1. // MyClass.h  
  2. class MyClassImpl; // forward declaration  
  3. class MyClass {  
  4. public:  
  5. MyClass();  
  6. ~MyClass();  
  7. int foo();  
  8. private:  
  9. MyClassImpl *m_pImpl;  
  10. }; 

現(xiàn)在,除非我們修改MyClass的公有接口,否則這個(gè)頭文件是不會(huì)被修改了。然后,我們用這個(gè)Impl類的實(shí)現(xiàn)來完成主類的細(xì)節(jié)實(shí)現(xiàn),在主類的構(gòu)造函數(shù)中,我們完成了實(shí)現(xiàn)類指針的實(shí)例化:

 
 
 
  1. // MyClass.cpp  
  2. class MyClassImpl {  
  3. public:  
  4. int foo() {  
  5. return bar();  
  6. }  
  7. int bar() { return var++; }  
  8. int var;  
  9. };  
  10. MyClass::MyClass() : m_pImpl(new MyClassImpl){}  
  11. MyClass::~MyClass()  
  12. {  
  13. try {  
  14. delete m_pImpl;  
  15. }  
  16. catch (...) {}  
  17. }  
  18. int MyClass::foo(){ return m_pImpl->foo(); } 

Pimpl機(jī)制其實(shí)這是橋接模式的一種變種。我們可以對實(shí)現(xiàn)類隨意的進(jìn)行增刪和修改,而不會(huì)導(dǎo)致包含MyClass.h的源代碼重新編譯。當(dāng)然,這樣做的時(shí)間開銷和空間開銷也是有的。

在實(shí)踐中,我們常常采用內(nèi)部類來完成Pimpl機(jī)制:

 
 
 
  1. // header  
  2. class fruit  
  3. {  
  4. public:   
  5. private:  
  6. class impl;  
  7. impl* pimpl_;  
  8. }   
  9. // implementation  
  10. class fruit::impl  
  11. {   
  12. };   
  13. fruit::fruit()  
  14. {  
  15. pimpl_ = new impl();  

希望看后本文,你會(huì)有收獲。

【編輯推薦】

  1. C/C++是程序員必須掌握的語言嗎?
  2. C/C++返回內(nèi)部靜態(tài)成員的陷阱
  3. C++三則 如無必要 勿增虛函數(shù)
  4. 淺談怎樣加快C++代碼的編譯速度
  5. C++連接mysql數(shù)據(jù)庫的兩種方法

名稱欄目:C++程序的設(shè)計(jì)機(jī)制2Pimpl機(jī)制
網(wǎng)頁路徑:http://www.5511xx.com/article/dpgcssd.html