最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++詳解PIMPL指向?qū)崿F(xiàn)的指針

 更新時(shí)間:2022年07月25日 10:12:44   作者:litanyuan  
PIMPL 是 C++ 中的一個(gè)編程技巧,意思為指向?qū)崿F(xiàn)的指針。具體操作是把類(lèi)的實(shí)現(xiàn)細(xì)節(jié)放到一個(gè)單獨(dú)的類(lèi)中,并用一個(gè)指針進(jìn)行訪問(wèn)

二進(jìn)制兼容性

①.概述

二進(jìn)制兼容是指當(dāng)庫(kù)文件升級(jí)后所有使用該庫(kù)的應(yīng)用程序不必重新編譯,其本質(zhì)就是類(lèi)的內(nèi)存布局不變。使用 pimpl 方法設(shè)計(jì)類(lèi)可以實(shí)現(xiàn)二進(jìn)制兼容的目的。

②.類(lèi)成員更改后的內(nèi)存布局

原始類(lèi)定義:

class demoClass
{
private:
  int a;
  int b;
};

類(lèi)更改后的定義:

class demoClass
{
private:
  char c;
  int a;
  int b;
};

②.pimpl 下類(lèi)的內(nèi)存布局

class demoClass
{
private:
  class demoClassImpl;
  demoClassImpl* impl;
};
class demoClass::demoClassImpl
{
public:
  int a;
  int b;
};

如上圖所示,無(wú)論類(lèi)的實(shí)現(xiàn)類(lèi)的數(shù)據(jù)成員如何變化,類(lèi)的布局始終不變。

功能實(shí)現(xiàn)細(xì)節(jié)隱藏

①.概述

作為接口的提供者,我們希望接口的使用者不必知道接口實(shí)現(xiàn)的更多細(xì)節(jié),因?yàn)楦鶕?jù)類(lèi)的私有數(shù)據(jù)成員和方法一般就可以猜測(cè)出接口的設(shè)計(jì)方式。

②.隱藏實(shí)現(xiàn)細(xì)節(jié)

通過(guò) pimp 方法設(shè)計(jì)類(lèi)可以實(shí)現(xiàn)隱藏類(lèi)的私有成員和方法的目的,僅對(duì)外暴露公有的接口。

class demoClass
{
public:
  void func();//對(duì)外接口
private:
  class demoClassImpl;
  demoClassImpl* impl;
};
class demoClass::demoClassImpl
{
private:
  int a;
  int b;
  void func1();
  void func2();
public:
  void func();
};
void demoClass::func()
{
  impl->func();
}

編譯依賴(lài)

①.概述

在一個(gè)常用的頭文件中如果包含了太多其他不必要的頭文件會(huì)嚴(yán)重降低編譯效率。

②.值類(lèi)型的成員必須引用其頭文件

值類(lèi)型的成員因?yàn)橐峙鋬?nèi)存大小必須知道其確定的定義,需要包含其頭文件

#include "A.h"
class demoClass
{
  A a;
};

如果僅有類(lèi)的申明則會(huì)出錯(cuò):

class A;
class demoClass
{
  A a;
};

③.指針或者引用類(lèi)型,僅需要類(lèi)的申明

class A;
class demoClass
{
  A *a;
};

④.函數(shù)的參數(shù)和返回值類(lèi)型,僅需要類(lèi)的申明

class A;
class demoClass
{
  A  func(A a);
};

⑤.使用 pimpl 降低編譯依賴(lài)

一般庫(kù)文件使用者僅需要包含當(dāng)前庫(kù)對(duì)應(yīng)的頭文件即可,不應(yīng)該再包含其他的頭文件。假設(shè)庫(kù)的頭文件定義如下:

#include "A.h"
class demoClass
{
private:
  A a;
public:
  void func();
};

此時(shí),若 A 為另外一個(gè)公共庫(kù),則庫(kù)的使用者需要在項(xiàng)目中配置 A.h 的路徑;若 A 為自定義類(lèi),則庫(kù)的提供者還需要額外提供 A.h 文件。

使用 pimpl 方法改進(jìn)則可以減少編譯依賴(lài),僅在類(lèi)的實(shí)現(xiàn)文件中包含頭文件即可:

// demoClass.h
class demoClass
{
public:
  void func();//對(duì)外接口
private:
  class demoClassImpl;
  demoClassImpl* impl;
};
// demoClass.cpp
#include "A.h"
class demoClass::demoClassImpl
{
private:
  A a;
public:
  void func();
};

動(dòng)態(tài)配置功能的實(shí)現(xiàn)方法

①.概述

使用 pimpl 的方式把類(lèi)的功能實(shí)現(xiàn)用另外一個(gè)獨(dú)立的類(lèi)來(lái)完成,可以在需要的時(shí)候動(dòng)態(tài)的配置類(lèi)的實(shí)現(xiàn)方法,而保持類(lèi)的接口不變。

②.代碼示例

公共接口類(lèi):

class demoClassImpl;
class demoClass
{
public:
    void func();//對(duì)外接口
public:
    demoClassImpl* impl;
};
void demoClass::func()
{
    impl->func();
}

功能實(shí)現(xiàn)抽象類(lèi):

class demoClassImpl
{
public:
    virtual void func() = 0;
};

功能實(shí)現(xiàn)派生類(lèi):

class demoClassImpl1 : public demoClassImpl
{
public:
    void func() { cout << "實(shí)現(xiàn)方式1" << endl; }
};
class demoClassImpl2 : public demoClassImpl
{
public:
    void func() { cout << "實(shí)現(xiàn)方式2" << endl; }
};

功能實(shí)現(xiàn)方式的動(dòng)態(tài)配置:

demoClass* demo = new demoClass;

demoClassImpl1* impl1 = new demoClassImpl1;
demo->impl = impl1;
demo->func();

demoClassImpl2* impl2 = new demoClassImpl2;
demo->impl = impl2;
demo->func();

到此這篇關(guān)于C++詳解PIMPL指向?qū)崿F(xiàn)的指針的文章就介紹到這了,更多相關(guān)C++ PIMPL內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 深入單鏈表的快速排序詳解

    深入單鏈表的快速排序詳解

    本篇文章是對(duì)單鏈表的快速排序進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C++類(lèi)中的static和const用法實(shí)例教程

    C++類(lèi)中的static和const用法實(shí)例教程

    這篇文章主要介紹了C++類(lèi)中的static和const用法,是C++面向?qū)ο蟪绦蛟O(shè)計(jì)中非常重要的概念,需要的朋友可以參考下
    2014-08-08
  • C++虛繼承的實(shí)現(xiàn)原理由內(nèi)存布局開(kāi)始講起

    C++虛繼承的實(shí)現(xiàn)原理由內(nèi)存布局開(kāi)始講起

    為了解決多繼承時(shí)的命名沖突和冗余數(shù)據(jù)問(wèn)題,C++提出了虛繼承,使得在派生類(lèi)中只保留一份間接基類(lèi)的成員,下面我們從內(nèi)存布局看看虛繼承的實(shí)現(xiàn)原理
    2022-06-06
  • OpenCV實(shí)現(xiàn)直線擬合

    OpenCV實(shí)現(xiàn)直線擬合

    這篇文章主要為大家詳細(xì)介紹了OpenCV實(shí)現(xiàn)直線擬合,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • C語(yǔ)言命令行參數(shù)的使用詳解

    C語(yǔ)言命令行參數(shù)的使用詳解

    本文主要介紹了C語(yǔ)言命令行參數(shù)的使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • C++中動(dòng)態(tài)內(nèi)存管理的實(shí)現(xiàn)

    C++中動(dòng)態(tài)內(nèi)存管理的實(shí)現(xiàn)

    本文主要介紹了C++中動(dòng)態(tài)內(nèi)存管理的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-09-09
  • QT實(shí)現(xiàn)動(dòng)態(tài)時(shí)鐘

    QT實(shí)現(xiàn)動(dòng)態(tài)時(shí)鐘

    這篇文章主要為大家詳細(xì)介紹了QT實(shí)現(xiàn)動(dòng)態(tài)時(shí)鐘,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • C 與 C++ 接口函數(shù)相互調(diào)用的實(shí)現(xiàn)

    C 與 C++ 接口函數(shù)相互調(diào)用的實(shí)現(xiàn)

    這篇文章主要介紹了C 與 C++ 接口函數(shù)相互調(diào)用的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • C語(yǔ)言double和float 實(shí)例分析

    C語(yǔ)言double和float 實(shí)例分析

    本文主要介紹了C語(yǔ)言中的浮點(diǎn)數(shù)(float,double),并通過(guò)實(shí)例代碼進(jìn)行分析比較,希望能幫助學(xué)習(xí)相關(guān)知識(shí)的同學(xué)
    2016-07-07
  • FFmpeg實(shí)現(xiàn)變速播放的兩種方法總結(jié)

    FFmpeg實(shí)現(xiàn)變速播放的兩種方法總結(jié)

    這篇文章主要為大家詳細(xì)介紹了FFmpeg中實(shí)現(xiàn)變速播放的兩種方法,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的可以了解一下
    2023-07-07

最新評(píng)論

新津县| 板桥市| 高平市| 马尔康县| 灵宝市| 隆回县| 静海县| 乌苏市| 永春县| 循化| 正安县| 信阳市| 合肥市| 常熟市| 凤城市| 沙雅县| 从化市| 安平县| 通江县| 偃师市| 保德县| 三台县| 南充市| 陈巴尔虎旗| 手机| 祁东县| 交城县| 英德市| 阳原县| 巴塘县| 宣化县| 浦城县| 和林格尔县| 乡宁县| 获嘉县| 柞水县| 静乐县| 深圳市| 富宁县| 荃湾区| 奈曼旗|