亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C++詳解PIMPL指向實現的指針

 更新時間:2022年07月25日 10:12:44   作者:litanyuan  
PIMPL 是 C++ 中的一個編程技巧,意思為指向實現的指針。具體操作是把類的實現細節(jié)放到一個單獨的類中,并用一個指針進行訪問

二進制兼容性

①.概述

二進制兼容是指當庫文件升級后所有使用該庫的應用程序不必重新編譯,其本質就是類的內存布局不變。使用 pimpl 方法設計類可以實現二進制兼容的目的。

②.類成員更改后的內存布局

原始類定義:

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

類更改后的定義:

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

②.pimpl 下類的內存布局

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

如上圖所示,無論類的實現類的數據成員如何變化,類的布局始終不變。

功能實現細節(jié)隱藏

①.概述

作為接口的提供者,我們希望接口的使用者不必知道接口實現的更多細節(jié),因為根據類的私有數據成員和方法一般就可以猜測出接口的設計方式。

②.隱藏實現細節(jié)

通過 pimp 方法設計類可以實現隱藏類的私有成員和方法的目的,僅對外暴露公有的接口。

class demoClass
{
public:
  void func();//對外接口
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();
}

編譯依賴

①.概述

在一個常用的頭文件中如果包含了太多其他不必要的頭文件會嚴重降低編譯效率。

②.值類型的成員必須引用其頭文件

值類型的成員因為要分配內存大小必須知道其確定的定義,需要包含其頭文件

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

如果僅有類的申明則會出錯:

class A;
class demoClass
{
  A a;
};

③.指針或者引用類型,僅需要類的申明

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

④.函數的參數和返回值類型,僅需要類的申明

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

⑤.使用 pimpl 降低編譯依賴

一般庫文件使用者僅需要包含當前庫對應的頭文件即可,不應該再包含其他的頭文件。假設庫的頭文件定義如下:

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

此時,若 A 為另外一個公共庫,則庫的使用者需要在項目中配置 A.h 的路徑;若 A 為自定義類,則庫的提供者還需要額外提供 A.h 文件。

使用 pimpl 方法改進則可以減少編譯依賴,僅在類的實現文件中包含頭文件即可:

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

動態(tài)配置功能的實現方法

①.概述

使用 pimpl 的方式把類的功能實現用另外一個獨立的類來完成,可以在需要的時候動態(tài)的配置類的實現方法,而保持類的接口不變。

②.代碼示例

公共接口類:

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

功能實現抽象類:

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

功能實現派生類:

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

功能實現方式的動態(tài)配置:

demoClass* demo = new demoClass;

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

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

到此這篇關于C++詳解PIMPL指向實現的指針的文章就介紹到這了,更多相關C++ PIMPL內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C++實現修改函數代碼HOOK的封裝方法

    C++實現修改函數代碼HOOK的封裝方法

    這篇文章主要介紹了C++實現修改函數代碼HOOK的封裝方法,有助于深入了解C++的HOOK原理,需要的朋友可以參考下
    2014-10-10
  • C語言 指針與數組的詳解及區(qū)別

    C語言 指針與數組的詳解及區(qū)別

    這篇文章主要介紹了C語言 指針與數組的詳解及對比的相關資料,需要的朋友可以參考下
    2017-03-03
  • 圖解AVL樹數據結構輸入與輸出及實現示例

    圖解AVL樹數據結構輸入與輸出及實現示例

    這篇文章主要為大家介紹了C++圖解AVL樹數據結構輸入與輸出操作示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-05-05
  • C語言課程設計之停車場管理問題

    C語言課程設計之停車場管理問題

    這篇文章主要為大家詳細介紹了C語言課程設計之停車場管理問題,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C語言實現簡易的掃雷游戲

    C語言實現簡易的掃雷游戲

    這篇文章主要為大家詳細介紹了C語言實現簡易的掃雷游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • C語言中l(wèi)seek()函數和fseek()函數的使用詳解

    C語言中l(wèi)seek()函數和fseek()函數的使用詳解

    這篇文章主要介紹了C語言中l(wèi)seek()函數和fseek()函數的使用詳解,是C語言入門學習中的基礎知識,需要的朋友可以參考下
    2015-08-08
  • Qt QStandardItemModel用法小結

    Qt QStandardItemModel用法小結

    QStandardItemModel可用作標準Qt數據類型的存儲庫,本文主要介紹了Qt QStandardItemModel用法小結,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-12-12
  • C++17結構化綁定的實現

    C++17結構化綁定的實現

    這篇文章主要介紹了C++17結構化綁定的實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-05-05
  • Qt使用QCamera實現切換相機,分辨率和圖像捕獲功能

    Qt使用QCamera實現切換相機,分辨率和圖像捕獲功能

    這篇文章主要為大家介紹了如何利用Qt中的相機類QCamera,取景器類QCameraViewfinder,圖像捕獲類QCameraImageCapture實現切換相機、分辨率和圖像捕獲功能,需要的可以了解一下
    2023-04-04
  • C語言解字符串逆序和單向鏈表逆序問題的代碼示例

    C語言解字符串逆序和單向鏈表逆序問題的代碼示例

    這篇文章主要介紹了C語言解字符串逆序和單向鏈表逆序問題的代碼示例,求逆序也是考研和面試中的基礎算法題類型,需要的朋友可以參考下
    2016-06-06

最新評論