1. 程式人生 > >C++中的PImpl的技巧及其作用

C++中的PImpl的技巧及其作用

1、PImpl(private implementation) 其主要作用是解開類的使用介面和實現的耦合。

2、Pimpl 手法能比較完善的解決這些問題。利用 Pimpl 手法,我們把資料細節隱藏到一個實現類裡:CImpl,而CSample 的 private 部分只剩下一個指標,那就是傳說中滴 Pimpl 指標

標頭檔案中:
 class CSample

  {

  private:

  class CImpl;//私有內部類

  shared_ptr mp;//自動釋放指標,通過Pimpl指標

  

  public:

  CSample();
  void print();

  };
實現檔案中:
    //內部類實現
 class CSample::CImpl
 {
  public:
      void doPrint()
      {
          //do something
          cout << "impl print" << endl;
      }
  };
 CSample::CSample() : mp(new CImpl)
  {

  }
  CSample::~CSample() 
  {
     //do not have to delete, std::shared_ptr is very nice
  }
  void
CSample::print()   {   //just call your PIMPL function ;   mp->doPrint();   }

類CSample僅向外界暴露了最小的介面,真正的實現由其內部類CImpl來完成。這樣無論CImpl如何修改,外界對此一無所知,從而保持介面的不變性。這種方式的另外一個好處是減少了標頭檔案之間的依賴關係。

  上面的程式碼裡,我使用了boost的shared_ptr來管理指標,簡化程式碼。類CSample僅向外界暴露了最小的介面,真正的實現由其內部類CImpl來完成。這樣無論CImpl如何修改,外界對此一無所知,從而保持介面的不變性。這種方式的另外一個好處是減少了標頭檔案之間的依賴關係。

  上面的程式碼裡,我使用了boost的shared_ptr來管理指標,簡化程式碼。

相關推薦

C++的PImpl技巧作用

PImpl(private implementation) 其主要作用是解開類的使用介面和實現的耦合。一個很簡單的實現如下:標頭檔案中:  1 class CSample 2 { 3 private: 4 class CImpl; 5     shared_ptr<CI

C++PImpl技巧及其作用

1、PImpl(private implementation) 其主要作用是解開類的使用介面和實現的耦合。 2、Pimpl 手法能比較完善的解決這些問題。利用 Pimpl 手法,我們把資料細節隱藏到一個實現類裡:CImpl,而CSample 的 private

C++關鍵字static的作用

對象 想要 關鍵字 局部作用域 blog 個數 初始化 ext lte 1、定義局部靜態變量,存放在全局數據區的靜態變量區。初始化的時候自動初始化為0; 其作用域為局部作用域,當定義它的函數或語句塊結束時,其作用域隨之結束。 2、static定義全局變量的時候,這個全局變量

C#.snk檔案的作用【轉】

 SNK,作為程式字尾的時候,是.net中的強密匙加密檔案! 當你把一個程式集放進GAC(全域性程式集快取)時,就要加強名(也就是簽名),在GAC中的程式集可以被所有程式引用訪問(相當於以前COM元件在登錄檔裡註冊一樣),如果不放進GAC,剛所有使用這個程式集都要複製這個程式集(也就是私有

[Linux學習筆記]Linux 系統的頂層目錄結構|linux的目錄及其作用

linux中的目錄及其作用 原連結:https://www.ibm.com/developerworks/cn/linux/l-cn-hardandsymb-links/index.html#listing1 最近學習linux時為了理解硬連結與軟連結去查了查資料,然後找到了業界大佬

C++static關鍵字的作用

static的作用主要有兩個方面: 限定作用域; 保持變數內容持久化。 static關鍵字在C++中的用法: 只在cpp內有效的全域性變數: 在cpp檔案的全域性範圍內宣告:   static int val = 0; 這個變數的含義是該cpp內有效,

C static 的常見作用

C程式一直由下列部分組成:   1)正文段——CPU執行的機器指令部分;一個程式只有一個副本;只讀,防止程式由於意外事故而修改自身指令;   2)初始化資料段(資料段)——在程式中所有賦了初值的全域性變數,存放在這裡。   3)非初始化資料段(bss段)——在程式中

C++explicit關鍵字的作用

explicit用來防止由建構函式定義的隱式轉換。   要明白它的作用,首先要了解隱式轉換:可以用單個實參來呼叫的建構函式定義了從形參型別到該類型別的一個隱式轉換。 例如:  

CC#static關鍵字的作用

1. static 變數  靜態變數的型別說明符是static。靜態變數當然是屬於靜態儲存方式,但是屬於靜態儲存方式的量不一定就是靜態變數。例如外部變數雖屬於靜態儲存方式,但不一定是靜態變數,必須由static加以定義後才能成為靜態外部變數,或稱靜態全域性變數。2. 靜態區域性變數  靜態區域性變數屬於靜態儲

C++this指標的作用以及用法詳解

為什麼引用this指標? 當我們在類中定義了一個變數,同時又在類成員函式中定義了同一個變數時,也就是變數名重複時,但是我們要想使用類中的定義的變數,此時就需要this指標了。 1.this指標的作用 指標存在於類的成員函式中,指向被呼叫函式類例項的地址。  一個物件的thi

c#volatile關鍵字的作用(zz)

恐怕比較一下volatile和synchronized的不同是最容易解釋清楚的。volatile是變 量修飾符,而synchronized則作用於一段程式碼或方法;看如下三句get程式碼: int i1;              int geti1() {return

C++::的作用

1、 作用域符號::的前面一般是類名稱,後面一般是該類的成員名稱,C++為例避免不同的類有名稱相同的成員而採用作用域的方式進行區分 如:A,B表示兩個類,在A,B中都有成員member。那麼       A::member就表示類A中的成員member       B

C++ explicit 關鍵字的作用(轉載) 2012-10-10 14:35

在 C++ 中, 如果一個類有隻有一個引數的建構函式,C++ 允許一種特殊的宣告類變數的方式。在這種情況下,可以直接將一個對應於建構函式引數型別的資料直接賦值給類變數,編譯器在編譯時會自動進行型別轉換,將對應於建構函式引數型別的資料轉換為類的物件。 如果在建構函式前加上 explicit 修飾詞, 則會禁止

C++建構函式的作用

建構函式用於解決類中的物件初始化的問題 建構函式是一類特殊的函式,與其他的成員函式不同的是建構函式建構函式不需要使用者來呼叫它,而是建立物件的時候自動的執行 #include <iostr

關於C++PIMPL設計模式的理解

前言    近段時間在學習Qt程式設計,在學習中發現在很多生成的程式碼中都有先定義一個Ui名稱空間,在Ui名稱空間中定義一個類,然後接下來又給出一個同名的類的定義,對這種用法由於在之前C++的學習中並沒有使用過,因此對該用法進行了一定的研究,結合老師的講解,在此談談對該設計模

scipy的包及其作用

scipy有多個子包組成 子包名描述 cluster聚類演算法 constants物理和數學上的一些常量 fftpack快速傅立葉變化 integrate整合和常微分方程的求解 interpolate插值和平滑樣條函式 io輸入和輸

C++虛擬函式的作用是什麼?它應該怎麼用呢?

虛擬函式聯絡到多型,多型聯絡到繼承。所以本文中都是在繼承層次上做文章。沒了繼承,什麼都沒得談。下面是對C++的虛擬函式這玩意兒的理解。 一, 什麼是虛擬函式 (如果不知道虛擬函式為何物,但有急切的想知道,那你就應該從這裡開始)簡單地說,那些被virtual關鍵字修飾的成員

c++virtual關鍵字的作用與Java多型的一點對比

轉載至:https://segmentfault.com/a/1190000006119157 動機 最近一直在使用C++寫win32程式,用了一些庫,裡面提供的類和demo各種是virtual這個關鍵字,一直不是很明白到底是啥用,於是查看了一些文件,寫小程式來實驗

淺析Javavolatile關鍵字及其作用

在 Java 多執行緒中如何保證執行緒的安全性?那我們可以使用 Synchronized 同步鎖來給需要多個執行緒訪問的程式碼塊加鎖以保證執行緒安全性。使用 synchronized 雖然可以解決多執行緒安全問題,但弊端也很明顯:加鎖後多個執行緒需要判斷鎖,較為消耗資源。所以

C++extern關鍵字的作用

1 基本解釋:extern可以置於變數或者函式前,以標示變數或者函式的定義在別的檔案中,提示編譯器遇到此變數和函式時在其他模組中尋找其定義。此外extern也可用來進行連結指定。       也就是說extern有兩個作用,第一個,當它與"C"一起連用時,如: exte