成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

C++ 慣用法之 PIMPL

開發 前端
PIMPL 是 C++ 中的一個編程技巧,意思為指向實現的指針。具體操作是把類的實現細節放到一個單獨的類中,并用一個指針進行訪問。

一、背景

1.概述

PIMPL 是 C++ 中的一個編程技巧,意思為指向實現的指針。具體操作是把類的實現細節放到一個單獨的類中,并用一個指針進行訪問。

2.二進制兼容性

(1) 概述

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

(2) 類成員更改后的內存布局

原始類定義:

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

內存布局如下:

類更改后的定義:

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

內存布局如下:

(3) pimpl 下類的內存布局

class demoClass
{
private:
  class demoClassImpl;
  demoClassImpl* impl;
};

class demoClass::demoClassImpl
{
public:
  int a;
  int b;
};

內存布局如下:

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

二、pimpl 應用

1.功能實現細節隱藏

(1) 概述

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

(2) 隱藏實現細節

通過 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();
}

2.降低編譯依賴

(1) 概述

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

(2) 值類型的成員必須引用其頭文件

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

#include "A.h"

class demoClass
{
  A a;
};

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

class A;
class demoClass
{
  A a;
};

(3) 指針或者引用類型,僅需要類的申明

class A;

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

(4) 使用 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();

};

2.動態配置功能的實現方法

(1) 概述

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

(2) 代碼示例

公共接口類:

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; }
};

功能實現方式的動態配置:

demoClass* demo = new demoClass;

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

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

責任編輯:趙寧寧 來源: 編程猿來如此
相關推薦

2024-02-02 12:42:42

C++Policy模板

2021-06-09 09:49:35

C++RAII語言

2011-06-09 14:52:09

Pimpl機制

2011-06-09 15:15:52

RAII

2009-12-14 10:03:57

Ruby慣用法

2015-07-13 09:46:44

Java習慣用法

2011-07-15 00:47:13

C++多態

2010-02-06 16:05:51

C++ Vector

2011-07-14 17:45:06

CC++

2011-07-20 10:06:54

CC++const

2011-07-10 15:26:54

C++

2011-07-13 18:24:18

C++

2015-12-28 13:45:53

Windows 10照片應用

2023-11-22 12:25:05

C++RTTI

2010-02-06 16:34:40

C++ Memento

2011-04-07 16:34:05

staticC++

2011-04-19 16:38:00

對象指針指針C++

2024-05-27 00:40:00

C++bitset

2021-10-12 13:35:30

C++Set紅黑樹

2010-02-04 16:35:24

C++ delete
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 色综合一区二区 | 日韩精品成人一区二区三区视频 | 久久综合伊人一区二区三 | 日韩精品在线播放 | 一级毛片免费 | 亚洲日日| 福利影院在线看 | 国产精品我不卡 | 久久国产精品首页 | 久久99精品久久久 | 亚洲欧洲成人av每日更新 | 亚洲一区二区在线电影 | 欧美久久不卡 | 国产97人人超碰caoprom | 男女视频在线观看 | 久久激情网 | 中文字幕 国产 | 国产黄色在线观看 | 国产一区二区三区精品久久久 | 91av在线电影 | 亚洲精品视频在线观看视频 | 成人免费福利视频 | 在线观看电影av | 久久久精品影院 | 爱爱视频网 | 免费观看一级毛片 | 午夜理伦三级理论三级在线观看 | 中文字幕 欧美 日韩 | 国产一区二区在线视频 | 亚洲一区二区在线视频 | 免费一级黄色录像 | 伊人导航| 久久91精品久久久久久9鸭 | 九九热国产精品视频 | 欧美日韩一区二区三区在线观看 | 日本亚洲精品成人欧美一区 | h视频在线观看免费 | 久久不卡日韩美女 | 色综合一区二区 | 国产精品99久久久久久人 | 国产高清视频在线观看 |