iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++详解PIMPL指向实现的指针
  • 192
分享到

C++详解PIMPL指向实现的指针

2024-04-02 19:04:59 192人浏览 薄情痞子
摘要

目录二进制兼容性功能实现细节隐藏编译依赖动态配置功能的实现方法二进制兼容性 ①.概述 二进制兼容是指当库文件升级后所有使用该库的应用程序不必重新编译,其本质就是类的内存布局不变。使用

二进制兼容性

①.概述

二进制兼容是指当库文件升级后所有使用该库的应用程序不必重新编译,其本质就是类的内存布局不变。使用 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;
};

如上图所示,无论类的实现类的数据成员如何变化,类的布局始终不变。

功能实现细节隐藏

①.概述

作为接口的提供者,我们希望接口的使用者不必知道接口实现的更多细节,因为根据类的私有数据成员和方法一般就可以猜测出接口的设计方式。

②.隐藏实现细节

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

动态配置功能的实现方法

①.概述

使用 pimpl 的方式把类的功能实现用另外一个独立的类来完成,可以在需要的时候动态的配置类的实现方法,而保持类的接口不变。

②.代码示例

公共接口类:

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();

到此这篇关于c++详解PIMPL指向实现的指针的文章就介绍到这了,更多相关C++ PIMPL内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C++详解PIMPL指向实现的指针

本文链接: https://www.lsjlt.com/news/165126.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • c语言怎么计算字符串长度
    在C语言中,可以使用内置的strlen()函数来计算字符串的长度。该函数位于string.h头文件中。以下是一个示例代码: #inc...
    99+
    2024-05-15
    c语言
  • c语言怎么判断三个数的大小
    可以通过比较三个数之间的大小关系来判断它们的大小。以下是一个示例代码: #include <stdio.h> int ...
    99+
    2024-05-15
    c语言
  • c++排序函数sort怎么使用
    在C++中,使用sort函数对容器中的元素进行排序,可以按照默认的升序排列,也可以自定义排序规则。 下面是一个简单的例子,对一个ve...
    99+
    2024-05-15
    c++
  • c++中string的compare函数怎么使用
    在C++中,可以使用string的compare函数来比较两个string对象的大小。该函数的原型如下: int compare(c...
    99+
    2024-05-15
    c++
  • c++中string的compare函数有什么用
    c++中string的compare函数用于比较两个字符串的大小关系。该函数返回一个整数值,表示两个字符串的比较结果。 具体来说,如...
    99+
    2024-05-15
    c++
  • c++中print函数的功能有哪些
    在C++中,通常使用std::cout来进行输出操作,而不是使用print函数。std::cout是C++标准库中的一个输出流对象,...
    99+
    2024-05-15
    c++
  • c语言数据结构怎么使用
    在C语言中,数据结构可以通过定义结构体来实现。以下是一些常见的数据结构的使用方法示例: 链表: #include <std...
    99+
    2024-05-15
    c语言
  • c++中print函数的用法是什么
    在C++中没有内置的print函数,但可以使用cout来输出内容到控制台。cout是C++标准库中的一个输出流对象,可以使用<...
    99+
    2024-05-15
    c++
  • c++中concept的用法是什么
    在C++20中,Concept是一种新的语言特性,用于定义类型要求和约束。Concept可以被用来约束函数模板、类模板和普通函数的参...
    99+
    2024-05-15
    c++
  • c++中concept的作用是什么
    在C++中,concept的作用是定义一种通用的约束,用于限制模板参数的类型范围。通过使用concept,可以在编译时对模板参数进行...
    99+
    2024-05-15
    c++
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作