1. 程式人生 > >關於C++中PIMPL設計模式的理解

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

前言

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

概念

    Pimpl(pointer to implementation, 指向實現的指標)是一種常用的,用來對“類的介面與實現”進行解耦的方法。這個技巧可以避免在標頭檔案中暴露私有細節,因此是促進API介面與實現保持完全分離的重要機制。通過在類中定義介面,將私有資料成員封裝在另一個類中的方式實現介面與實現的分離。

特點

    由於當頭檔案改變時,#include該檔案的任何檔案都需要重新編譯,即使這些更改僅適用於類的私有成員,情況也是如此。 PIMPL設計模式通過介面和實現的分離,可以降低模組耦合和編譯依賴,提高編譯速度。當類的內部改變時,不需要重新編譯呼叫的程式。

程式碼例項

cimplement.h檔案

#ifndefCIMPLEMENT_H
#defineCIMPLEMENT_H
classCImplement//定義一個實現類
{
public:
CImplement();
voiddoSomethingReal();
};
#endif//CIMPLEMENT_H

c.h檔案

#ifndefC_H
#defineC_H
class
CImplement;//前置宣告
classC
{
public:
C();
~C();
voiddoSomething();
private:
CImplement*c;/*PIMPL設計格模式關鍵,在C類中定義一個私有指向實現類的指標資料成員。
通過該指標實現一系列操作,那麼在改變操作時只需要重新編譯cimplement.h即可*/
};
#endif//C_H

cimplement.cpp檔案

#include"cimplement.h"
#include<iostream>
usingnamespacestd;
CImplement::CImplement()//空的建構函式
{
}
voidCImplement::doSomethingReal
()//真正的doSomething函式實現方式
{
cout<<"CcallCImplementdosomething"<<endl;
}

c.cpp檔案

#include"c.h"
#include"cimplement.h"
C::C():c(newCImplement)//使用括號賦值法為內部指標成員賦值,用new建立
{
}
C::~C()//解構函式,主動通過delete刪除new建立的物件,釋放記憶體
{
deletec;
}
voidC::doSomething()//通過內部指標呼叫真正實現函式
{
c->doSomethingReal();
}

main.cpp檔案

#include<QCoreApplication>
#include"c.h"
intmain(intargc,char*argv[])
{
Cc;//建立一個C類物件
c.doSomething();/*呼叫doSomething函式,但實質是呼叫cimplement類中的doSomethingReal函式
當需求發生改變時,例如需要修改輸出語句時,只需要修改cimplement類中的函式
這樣main檔案不需要重新編譯,在大型工程中更能體現這種設計模式的優越性*/
return0;
}

程式執行結果

後記

    以上就是我個人的一些理解,並沒有多深奧,只是起一個拋磚引玉的作用,總之該設計模式在後面大規模的程式中經常用到,因此掌握是非常有必要的。另外如果哪些地方見解有誤,還請批評指正。

相關推薦

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

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

工廠模式(think in java設計模式

org 我們 import lac otf 返回值 類型 int ava 工廠模式:工廠模式是利用工廠類的工廠方法創建對象的一種設計模式,目的是創建對象,但是很多時候創建對象我們會考慮很多其他因素~~~~比如限定輸入,限定返回值是否某個,比如在創建的過程中進行一些判斷,通過

叠代器模式(think in java設計模式

一個 div 封裝 imp 叠代器 方法 println rri 數字 叠代器模式:用來叠代一個容器集合數組的一種模式。可能大家很多時候是用for循環進行叠代的,但是實際上for循環內部不能使用remove方法,但是叠代器可以,這是因為叠代器內部進行了該方法的邏輯處理。同樣

模板方法模式(think in java設計模式

方法 bst pac code pri ack 單點 size clas 模板方法模式:模板方法模式顧名思義就是一種構造模塊化的設計模式。將一次行為分為多種行為,靈活的調用不同模塊進行工作。比如在飯店吃飯,分為:點菜,吃飯,買單等行為無論什麽飯店大致都是這三種行為。因此我們

改善C#程序的建議4:C#標準Dispose模式的實現

答案 weight except 垃圾回收器 min 發現 使用 ont 普通 原文:改善C#程序的建議4:C#中標準Dispose模式的實現需要明確一下C#程序(或者說.NET)中的資源。簡單的說來,C#中的每一個類型都代表一種資源,而資源又分為兩類: 托管資源:由CL

C#的IDisposable模式用法詳解

數據庫 nor 是否 entry block 記錄日誌 自定義 技術分享 ssa 本文實例講述了C#中IDisposable模式的用法,針對垃圾資源的回收進行了較為詳細的講解。分享給大家供大家參考之用。具體方法如下: 首先,對於垃圾回收而言,在C#中,托管資源的垃圾回收是

C#學習之設計模式:工廠模式

缺陷 進行 type 系列 concrete 改變 cnblogs static 優劣   最近研究一下設計模式中工廠模式的應用,在此記錄如下:   什麽是工廠模式?   工廠模式屬於設計模式中的創造型設計模式的一種。它的主要作用是協助我們創建對象,為創建對象提供最佳的方式

C# 23種設計模式

single 責任鏈模式 tor 軟件工程 原型模式 使用 build 設計 簡單 設計模式(Design pattern)是一套被反復使用、多數人知曉的、經過分類編目的、代碼設計經驗的總結。 使用設計模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。 毫無疑問

Decorator設計模式的實現 裝飾設計模式學習筆記

Decorator設計模式的實現中 裝飾裝飾設計模式 a)當某個類的某個方法不適應當前業務的需要思路:》擴展父類的可供擴展的方法,可以使有,但不優》裝飾設計模式(推薦) 開發步驟: 1)寫一個普通類或寫一個普通類擴展[extends]一個父類 2)寫一個需要被包裝的實例變量 3)通過構造方式為被包裝的實例變量

Djangosettings設計模式(單例模式)

實例化 用戶 就是 auto 技術 軟件設計 img 文件的 單例 配置文件: 需求:配置文件,默認配置和手動配置分開,參考django的配置文件方案,默認配置文件放在項目容器內部,只讓用戶做常用配置。 /bin/settings.py(手動配置) PLUGIN_ITEMS

Java設計模式(七):觀察者模式

name int 還要 The else 意圖 http exceptio 所有 介紹 觀察者模式是行為設計模式之一。當您對對象的狀態感興趣並希望在有任何更改時收到通知時,觀察者設計模式非常有用。在觀察者模式中,監視另一個對象狀態的對象稱為Observer,正在被監視的對象

Java設計模式(八):建造者模式

伸縮 null clas 示例代碼 最簡 裝配 角色扮演 app 但是 介紹 今天我們將研究java中的Builder模式。Builder 設計模式是一種創造性的設計模式,如工廠模式和抽象工廠模式。 當Object包含許多屬性時,引入了Builder模式來解決Factory

spirng設計模式

spring中的設計模式 應該說設計模式是我們在寫程式碼時候的一種被承認的較好的模式,就像一種宗教信仰一樣,大多數人承認的時候,你就要跟隨,如果你想當一個社會存在的話。好的設計模式就像是給程式碼造了一個很好的骨架,在這個骨架裡,你可以知道心在哪裡,肺在哪裡,因為大多數人都認識這樣的骨架,就有了很

C語言實現設計模式之單例模式

有過面試經驗的朋友,或者對設計模式有點熟悉的朋友,都會對單例模式不陌生。對很多面試官而言,單件模式更是他們面試的保留專案。其實,我倒認為,單件模式算不上什麼設計模式。最多也就是個技巧。 簡單的單例模式(不考慮多執行緒和release)要是用C++寫,一般這麼寫。 #include <s

c++虛擬函式的理解

虛擬函式的作用,事實上就是實現了多型性,就是實現以共同的方法,但因個體差異而採用不同的策略。下面有程式碼例項來描述: class A{ public: void print(){ cout<<”This is A”<<endl;} }; class B:publ

Java併發程式設計設計模式解析(二)一個單例的七種寫法

Java單例模式是最常見的設計模式之一,廣泛應用於各種框架、中介軟體和應用開發中。單例模式實現起來比較簡單,基本是每個Java工程師都能信手拈來的,本文將結合多執行緒、類的載入等知識,系統地介紹一下單例模式的演變,並體現在7種不同的單例設計中。說到這個,非常像孔乙己裡那個“回字有四種寫法”的梗,不過與封建迂腐

C#之常用設計模式(unity版本)

                                          &nb

Spring設計模式

又是 管理 pla day gif 關聯 動態代理 代理 aop 簡單工廠模式:實質是由一個工廠類根據傳入的參數,動態決定應該創建哪一個產品類。spring中的BeanFactory就是簡單工廠模式的體現,根據傳入一個唯一的標識來獲得bean對象,但是否是在傳入參數後創建還

微服務設計模式

          說到設計模式,大家一般會想到,工廠、單例等24種基本設計模式,當然也會想到併發型模式,生產-消費者模式,執行緒池模式等,但是微服務中用到什麼設計模式了?前兩篇介紹了,挎鬥模式和代表模式,當然這一類設計模式屬於雲設計模式。AzureCAT

C++ 單例設計模式

單例模式是指只有一個例項物件,方法是把建立類的建構函式以及拷貝函式放在private裡 #include<iostream> #include<stdlib.h> using namespace std; class Singleton { private: Sing