標頭檔案依賴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