1. 程式人生 > >標頭檔案依賴pimpl法

標頭檔案依賴pimpl法

標頭檔案依賴,Pimpl法,加速編譯
   舉個例子:
      // File: SoundSystem.h

      #include "StreamFilter.h"
      #include "Emitters."

class SoundSystem {
      public:
         // ...
      private:
         StreamFilter currentFilter;
         EmitModeConfig modeConfig;
      };
   一目瞭然的是,看得出SoundSystem實現使用了StreamFilter和EmitModeConfig的定義,所以#include 了他們的定義在此SoundSystem.h中,可是隨著專案的不斷推進,class SoundSystem中依賴的使用型別會增多,它的header被引入到其它模組中,不知不覺的編譯時間越來越長,改進之:

      // File: SoundSystem.h

class StreamFilter;
class EmitModeConfig;

class SoundSystem {
      public:
         // ...
      private:
         StreamFilter* currentFilterPtr;
         EmitModeConfig* modeConfigPtr;
      };

      // File: SoundSystem.cpp
      #include "StreamFilter.h"
      #include "Emitters."

      SoundSystem::SoundSystem() {

         //...
         currentFilterPtr = new StreamFilter;
         modeConfigPtr = new EmitModeConfig;
      }

      SoundSystem::~SoundSystem() {
         delete currentFilterPtr;
         delete modeConfigPtr;
         //...
      }
      這麼一來,把StreamFilter和EmitModeConfig的#include藏到了SoundSystem的實現程式碼中,以後對SoundSystem的部分改動不會導致其它模組的rebuild哦,不過由此可能會犧牲一點效率吧!

      記得,有位微軟的C++翹楚人物,Herb Sutter給這種技巧稱為Pimpl ( Private Implemention ), 用的恰到好處時,可以提高專案開發速度,同時模組的標頭檔案間的#include關係得以緩解,可以避開迴圈依賴,而且可以獲得一個良好的物理設計。

總結:
      Pimpl方法感覺很不錯,
      使用這個方法的時候,一定要注意的是在這個地方的變化,這個是我第二遍看的時候才注意到的.
     class SoundSystem {
      public:
         // ...
      private:
         StreamFilter currentFilter;
         EmitModeConfig modeConfig;

      };

      採用Pimpl方法後,變為
     class SoundSystem {
      public:
         // ...
      private:
         StreamFilter* currentFilterPtr;
         EmitModeConfig* modeConfigPtr;

      };
      所以在.cpp檔案中就有了new和delete的操作.

      對於這種方法有一個疑問?對於那種存在包含眾多類的情況下,這種方法的駕馭不是一般人能夠掌握的吧.或許這種方法就不太使用了,不如等待一會,編譯.

相關推薦

檔案依賴pimpl

標頭檔案依賴,Pimpl法,加速編譯   舉個例子:      // File: SoundSystem.h      #include "StreamFilter.h"      #include "Emitters."class SoundSystem {      

makefile 自動生成檔案依賴關係

在使用makefile 自動生成標頭檔案依賴是,大家多半使用了下面這個方法。 這個sed語句被稱之為 "上帝的符號",可讀性不言而喻。(PS:CSDN這個排版怎麼也搞不好,只能用圖片了。) gcc的 -MMD 選項可以自動生成帶有依賴規則的.d檔案,為建立標頭檔案依賴帶來

Linux學習筆記-Makefile優化之檔案依賴

如果標頭檔案被更新,則包含了它的cpp檔案應該被重新編譯。 比如first裡面有個函式,main函式呼叫了first裡面的函式,那麼first.h變化了,main肯定要重新編譯 這裡有個知識點: -MMD 【這是編譯器使用的選項】 g++/gcc 編譯xxx.cp

檔案之間存在依賴關係該如何包含?

本文旨在探討標頭檔案之間存在依賴關係時,包含順序的影響。 分兩種情況討論: 標頭檔案A單方面依賴標頭檔案B: struct.h: struct abc { int num; char *ptr; }; def.h: typedef struct abc AB

安利個人開發維護的一個C++模板庫(沒有三方依賴, 純檔案) oyoungs/dispatch

專案倉庫地址 C++模板庫oyoungs/dispatch介紹 這是個人開發維護的一個工具性質的純標頭檔案的C++庫 內容包括 dispatch.hpp 同步/非同步排程任務佇列, async

C++ 檔案順序和隱含依賴

今天編寫一個程式,拷貝另外一個檔案的標頭檔案時,沒有注意標頭檔案之間的內在依賴關係,導致編譯出錯,浪費了不少時間去定位和分析,才發現是標頭檔案順序不對導致的編譯問題,這也給自己以後編寫可靠程式碼時提供了一個主意項,準備參考google C++程式設計風格的標頭檔案順序。

idea使用javah一鍵編譯JNI的.檔案

.h標頭檔案中方法命名規範需要用到包名,所以,使用javah編譯jni時工作目錄一定要是在包名父目錄中,否則Exception in thread “main” java.lang.IllegalArgumentException: Not a valid class name:

C語言:解決多個C檔案包含同一檔案引起的檔案重複包含問題

解決多個C檔案包含同一標頭檔案引起的檔案重複包含問題,並給出全域性變數如何定義和宣告的方法. 解決方法: 1. 定義公共檔案: global.c 和global.h 其中, global.c檔案中: #include "global.h" //定義全域性變數 int g

iOS 開發: 解決Xcode7.3 不能自動索引檔案,檔名等問題

iOS 開發: 解決Xcode7.3 不能自動索引標頭檔案,檔名,程式碼補全等問題 解決方案: 開啟Xcode –> Target –> BuildSettings –> Apple LLVM 7.1 -Language-Objective C 下面的 Weak

C++primer(第五版)Sales_item.h檔案

C++primer(第五版)1.51練習章節需要有一個Sales_item類,但是給的網站有點蛋疼,直接複製下面就好咯: #ifndef SALESITEM_H #define SALESITEM_H #include <iostream> #include <string

檔案的編寫和引用

      我用的是 Dev-c++  編寫標頭檔案     首先寫標頭檔案裡面的函式,       然後儲存,記得字尾寫  .h   就行   例:(順序表的標

JNI學習之Android studio 生成.h 檔案

Android Studio  生成.h標頭檔案的方法之一 1、在任意class類 中編寫一個native 方法。 public class MainActivity extends Activity { /** * 編寫native 靜態方法 */

C++ assert.h檔案

NVIDIA面試筆試題之一: assert.h是c標準庫的一個頭檔案,該標頭檔案的主要目的就是提供一個assert的巨集定義。 assert只是對所給的表示式求值,就像if判斷語句中一樣,然後如果該值為真則正常執行,否則報錯,並呼叫abort(),產生異常中斷,exit出來。 該巨集可以

對linux下程式設計中用到的檔案的一些定義及函式進行解譯(本人使用過程中用到過的不明白的定義及函式)

1、typedef unsigned long int pthread_t; 型別定義: typedef unsigned long int pthread_t; //come from /usr/include/bits/pthreadtypes.h 用途:pthread_t用於宣

C++從零開始區塊鏈:P2P模組之公共檔案定義

搞了臺阿里雲做內網打洞測試,巨集開關ALITEST用來內外網測試轉換 #define SERVERIP “xx.xx.xx.xx” 是外網測試機的外網IP #include <cstdio> #include <cstdlib> #include <cst

【CTF雜項】常見檔案檔案檔案尾格式總結及各類檔案頭

檔案標頭檔案尾總結 JPEG (jpg),   檔案頭:FFD8FF                        檔案尾:FF D9PNG (png),    檔案頭:89504E47                      檔案尾:AE 42 60 82GIF (gif),   檔案頭:4749463

C++ algorithm 檔案 定義的 sort() 實現絕對值排序

Problem Description 輸入n(n<=100)個整數,按照絕對值從大到小排序後輸出。題目保證對於每一個測試例項,所有的數的絕對值都不相等。 Input 輸入資料有多組,每組佔一行,每行的第一個數字為n,接著是n個整數,n=0表示輸入資料的結束,不做處理。

排序函式的檔案

程式設計中排序函式可以自己寫,也可以呼叫標頭檔案中的庫函式。 c程式設計中如果需要使用排序函式,需要呼叫<stdlib.h>標頭檔案。排序函式是qsort,也就是快速排序。具體函式語法如下: #include<stdio.h> #include<stdlib

C/C++避免檔案重複包含的方法

C/C++避免標頭檔案重複包含的方法 1. #ifndef 2. #pragma once 3. 混合使用 在實際的程式設計過程中,因為會使用多個檔案,所以在檔案中不可避免的要引入一些標頭檔案,這樣就可能會出現一個頭檔案被 include

檔案的搭建

       在程式設計過程中,為了避免在多個原始檔中標頭檔案被多次的包含,可以通過搭建一個頭檔案避免這種情況。        在搭建標頭檔案時,先要在一個·檔案下建立一個空白標頭檔案,例如現在搭建一個 Add.h