Pimpl 习惯用法与纯虚拟类接口

2023-11-29

我想知道什么会让程序员选择 Pimpl 惯用法或纯虚拟类和继承。

据我了解,pimpl 习惯用法为每个公共方法和对象创建开销提供了一个显式的额外间接寻址。

另一方面,纯虚拟类为继承实现提供了隐式间接(vtable),并且我知道没有对象创建开销。
EDIT:但是如果你从外部创建对象,你就需要一个工厂

是什么让纯虚拟类不如 pimpl 习惯用法那么受欢迎?


当编写 C++ 类时,应该考虑它是否会

  1. 值类型

    按价值复制,身份从来不重要。它适合作为 std::map 中的键。例如,“字符串”类、“日期”类或“复数”类。 “复制”此类的实例是有意义的。

  2. 实体类型

    身份很重要。始终通过引用传递,而不是通过“值”传递。通常,“复制”类的实例根本没有意义。当确实有意义时,多态“克隆”方法通常更合适。示例:Socket 类、数据库类、“策略”类、任何函数式语言中的“闭包”类。

pImpl 和纯抽象基类都是减少编译时依赖性的技术。

然而,我只使用 pImpl 来实现值类型(类型 1),并且仅在某些时候当我确实想要最小化耦合和编译时依赖性时才使用。通常,这是不值得打扰的。正如您正确指出的那样,存在更多语法开销,因为您必须为所有公共方法编写转发方法。对于类型 2 类,我总是使用带有关联工厂方法的纯抽象基类。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Pimpl 习惯用法与纯虚拟类接口 的相关文章

  • VSTS 构建失败/发布无法在 bin 文件夹中找到 roslyn\csc.exe

    我们有一个网站项目 安装了以下 nuget 软件包 Microsoft CodeDom Providers DotNetCompilerPlatform 1 0 8 Microsoft Net Compilers 2 4 0 The web
  • MVC Core IActionResult 含义

    什么是IActionResult 我尝试查看 MSDN 和其他网站 但需要通用 常见 易于理解的答案 MSDN IActionResult https learn microsoft com en us dotnet api microso
  • 同步执行异步函数

    我对此主题进行了大量搜索 并且阅读了本网站上有关此主题的大部分帖子 但是我仍然感到困惑 我需要一个直接的答案 这是我的情况 我有一个已建立的 Winform 应用程序 但无法使其全部 异步 我现在被迫使用一个全部编写为异步函数的外部库 在我
  • C++ 模板中的名称查找

    我有一些 C 代码 如果没有 fpermissive 选项 就无法再编译 这是我无法分享的专有代码 但我认为我已经能够提取一个简单的测试用例来演示该问题 这是 g 的输出 template eg cpp In instantiation o
  • 泛型与接口的实际优势

    在这种情况下 使用泛型与接口的实际优势是什么 void MyMethod IFoo f void MyMethod
  • C++ 中的单例和抽象基类

    最近我遇到了关于实现 Singleton 但涉及抽象基类的问题 假设我们有这样的类层次结构 class IFoo it s ABC class Foo public IFoo 我们的单例类定义如下 template
  • 基于 MS Bot Framework 中的响应分支对话框/表单

    我们正在尝试使用 MS Bot Framework 但尚未完全弄清楚如何实现此场景 我们有一个 LUIS 对话框 类型 它工作正常并且经过适当的培训 以常见的三明治为例 LUIS 意图寻找的基本内容是用户询问订单状态 如果问题中提供了订单号
  • 具有多重继承的类的 sizeof

    首先 我知道 sizeof 取决于机器和编译器的实现 我使用的是 Windows 8 1 x64 gcc 5 3 0 没有标志传递给编译器 我从大学讲座中得到了以下代码 include
  • C++ 私有静态成员变量

    此 C 代码在编译时产生链接器错误 A h class A public static void f private static std vector
  • async wait 在调用异步方法时返回 Task> 而不是 List

    我正在尝试了解 async wait 的用法 并且研究了一些博客文章 现在我已经编写了一个测试代码 但它没有按照我期望的方式工作 我有一个返回列表的方法 private List
  • 正则表达式删除某些字符周围不需要的空格

    我正在尝试从 JavaScript 文件中删除一些不需要的空格 并在将文件发送到客户端之前使用 C 和 Regex 组合文件 我有一个JavascriptHandler处理 js 文件 效果很好 这是我用来 打包 JavaScript 的函
  • C++ 中的 Java ArrayList [重复]

    这个问题在这里已经有答案了 在Java中我可以做 List
  • 如何附加到 xml

    我有这个xml
  • 为什么C++变量是指针时不需要正确定义?

    我对 C 语言完全陌生 特别是指针 经验主要是 PHP 并且希望对以下内容进行一些解释 我已经尝试寻找答案 这两行代码如何能够在我的程序中完成完全相同的工作 第二行似乎违背了我迄今为止所学到和理解的关于指针的一切 char disk 3 D
  • 无法将方法组“Read”转换为非委托类型“bool”

    我正在尝试使用SqlDataReader检查条目是否存在 如果存在则返回ID 否则返回false 当我尝试编译时 出现错误 无法将方法组 Read 转换为非委托类型 bool 我一直在遵循在 VB 中找到的示例 但似乎翻译可能不正确 pri
  • Active Directory UserPrincipal.Current.GetGroups() 返回本地组而不是 Web 服务器上的组

    以下内容在我的本地开发盒上效果很好 但是 当我将其移动到网络服务器时 它失败了 甚至不会记录错误 public static List
  • C 中什么函数可以替换字符串中的子字符串?

    给定一个 char 字符串 我想查找所有出现的子字符串并将其替换为备用字符串 我没有看到任何简单的函数可以实现这一点
  • 如何使用简历实现一个“一网打尽”的异常处理程序?

    我想知道我怎样才能写一个抓住他们全部应用程序级别的异常处理程序将为用户提供恢复应用程序流程的选项 如果您正在运行 Windows 窗体应用程序 将处理程序添加到Application ThreadException event
  • 如何将 Metro 应用部署到桌面?

    我正在尝试将我的 C 应用程序部署到我的 Windows 8 Metro 桌面 我可以在 bin 文件夹中看到部署的文件 但是当我尝试打开它们时 出现以下错误 该应用程序只能在 AppContainer 的上下文中运行 我检查了属性上下文菜
  • 什么时候使用静态库需要头文件?

    如果我在 Linux 中用 C 创建一个静态库并生成 a 文件 我 或其他人 如何使用该库 例如 我的库定义了一个类 我认为仅仅提供 a 文件是不够的 还需要提供头文件 我如何知道 a 文件必须提供哪些头文件 例如 我是否需要提供我的库代码

随机推荐

  • Phonegap 应用程序:外部 URL 无法在 IOS 的应用内浏览器中打开

    外部 URL 无法在我的 PhoneGap IOS 应用程序的系统浏览器中打开 我正在使用 PhoneGap Build 2 7 0 JavaScript window open myURL blank location yes 配置文件
  • 使用 WHERE ... IN (...) 进行慢速 SQL 查询的替代方法

    这实际上是一个更大的复杂查询的一部分 根据查询计划 此语句的排序主导较大查询的成本 通过具体化查询的这一部分 我验证了它在成本中占主导地位 select sID ROW NUMBER over partition by sID order
  • 奇怪的 java 行为与原始类型的转换

    可能有人在某个地方问过这个问题 但我找不到它 有人可以澄清为什么这段代码会编译并打印出来吗1 long i byte char int long 1 System out println i 它被解析为 long i byte char i
  • Java 8 Stream 与批处理

    我有一个包含项目列表的大文件 我想创建一批项目 并使用该批次发出 HTTP 请求 所有项目都需要作为 HTTP 请求中的参数 我可以很容易地做到这一点for循环 但作为 Java 8 爱好者 我想尝试使用 Java 8 的 Stream 框
  • 与儿童一起使用 CCSprite 淡出

    我正在使用一个CCSprite和其他一些人CCSprite作为子对象添加的对象 我使用的其他动画 缩放和旋转 效果很好 并且子对象也有动画 但是当我使用时CCFadeOut 它只会淡化父级 我读到淡出不适用于儿童 除了迭代每个孩子并调用每个
  • 如何在asp.net中的preinit函数中访问Session?

    void Page PreInit Object sender EventArgs e HttpCookie userInfo userInfo Request Cookies userInfo Session EmpID userInfo
  • TPU本地文件系统不存在?

    我写了一个神经网络模型来分析图像并在最后提取 8 个浮点数 该模型在我的计算机上运行良好 但速度缓慢 因此我在 TPU 云上尝试它 然后砰 我有一个错误 I1008 12 58 47 077905 140221679261440 tf lo
  • Python 中带有两个条件的 if 语句

    我正在编写一个简单的控制台程序来帮助我自己和一些地质学同学进行岩石样本分析 我们的讲师为我们提供了一个流程图 有助于指定样本的特征 我正在尝试将其制作成控制台程序 我的问题是第 9 行的 if 语句是否可以接受两个条件 如果可以的话我写得正
  • 在 Angular 中渲染模板之前加载数据

    我在用角6并使用单向绑定 我在组件中的代码如下所示 ngOnInit this profile getUser 1 subscribe data gt this userData this compiler constructUserDat
  • 如何使用 Puppeteer 监听历史记录?

    使用Puppeteer 是否可以监听浏览器历史记录API 例如history pushState history replaceState or history popState 通常由单页应用程序框架路由器在幕后使用 例如react ro
  • 尝试安装模块 win32clipboard

    我是 python 新手 我正在尝试安装 win32clipboard 以便能够使用此代码 import win32clipboard win32clipboard OpenClipboard win32clipboard SetClipb
  • 在 .NET 中序列化 System.Drawing.Color

    我对具有 System Drawing Color 成员的类使用了默认的 NET 序列化 该代码现在已被人们使用 我需要向该类添加一个额外的成员 但仍反序列化旧版本 因此 我尝试了执行此操作的标准方法 ISerialized 接口 使用 S
  • 打印出的 html 页面上有水印

    https jsfiddle net dhaileytaha g92gr1sy 3 上面的小提琴有一个打印输出页 我需要在打印输出页上添加水印 我不知道我们该怎么做 js jquery css 或以上都不是 请帮忙 document get
  • CustomPicker 确定和取消按钮的颜色

    我在android项目中有这个custompicker类 public class CustomPickerRenderer PickerRenderer private Context context private IElementCo
  • python元组可以修改吗?

    我正在读入并解析一些数据 基本上 数据是一堆整数和字符串 所以我不能只使用列表来存储数据 每组数据中都会包含一定数量的项目 但有时会丢失一些项目 这是我所拥有的 users list of objects I ll be creating
  • Dockerfile 中是否需要“FROM”子句?

    对于我遇到的所有 Dockerfile 诚然不是很多 它们都使用了FROM基于现有图像的子句 即使它是FROM scratch 这个条款是必须的吗 是否可以有一个没有的 DockerfileFROM条款 这样创建的容器能做些什么吗 EDIT
  • json对象转换为java字符串

    我有这样的 json 文件 我想使用 org simple json 将 json 转换为字符串 header IssuerID 000141 AuthenticationID e07020c0d040a050a0808099 Authen
  • 非常基础的 Java

    我对 Java 很陌生 这是我的代码 public class funk int largest int a int b int c if a gt b if a gt c return a else if b gt c return b
  • 使用 Winform 绘图

    我想获得一些 WinForm Graphics 知识 因此我正在将我的小型 2D 编辑器从 XNA 重写为仅 WinForm Graphics 现在 我为自己的图块集创建了一个新的 UserControl 但正如我所见 Paint方法仅在控
  • Pimpl 习惯用法与纯虚拟类接口

    我想知道什么会让程序员选择 Pimpl 惯用法或纯虚拟类和继承 据我了解 pimpl 习惯用法为每个公共方法和对象创建开销提供了一个显式的额外间接寻址 另一方面 纯虚拟类为继承实现提供了隐式间接 vtable 并且我知道没有对象创建开销 E