是否可以用 C++ 编写敏捷的 Pimpl?

2024-01-22

我一直在研究 Pimpl 习语并从中获得了各种好处。我唯一不太感兴趣的是定义函数时的感觉。

  • 一旦进入标题(P def)
  • 一旦到达 .cpp 的顶部(Impl def)
  • 一旦进入.cpp(Impl Impl)中间
  • 一旦到达 .cpp 的下端(P Impl)

我真的很喜欢减少代码差异和冗余,当我必须在当前项目中相对复杂的 Impl 中添加或更改功能时,我觉得我的代码不够完善。

我的问题是,有什么有效的方法来暗示或模板化我的类,如果我要定义一个新函数,我只需要编写一个显式定义和实现,而其余的在空间上保持接近代码中的显式内容;如果我要更改某个功能,所需的更改会尽可能少?


您可能会考虑以下一些事情:

用于最大程度地减少重复声明的 Interface 类。客户端将使用PublicImplementation他们的代码中的类。

Pimpl.h

#ifndef PIMPL_H_
#define PIMPL_H_

#include <memory> // std::unique_ptr

class Interface
{
public:
    virtual ~Interface() {}

    virtual void func_a() = 0;
    virtual void func_b() = 0;
};

class PublicImplementation
{
    // smart pointer provides exception safety
    std::unique_ptr<Interface> impl;

public:
    PublicImplementation();

    // pass-through invoker
    Interface* operator->() { return impl.get(); }
};

#endif // PIMPL_H_

Pimpl.cpp

#include "Pimpl.h"
#include <iostream>

class PrivateImplementation
: public Interface
{
public:

    void func_a() override { std::cout << "a" << '\n'; }
    void func_b() override { std::cout << "b" << '\n'; }
};

PublicImplementation::PublicImplementation()
: impl(new PrivateImplementation)
{
}

最后,这就是客户端代码的作用:

Main.cpp

#include "Pimpl.h"

int main()
{
    PublicImplementation pi; // not a pointer

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

是否可以用 C++ 编写敏捷的 Pimpl? 的相关文章

  • 有没有办法分析 WCF 应用程序的性能?

    我们正在尝试测量我们的系统的性能 该系统是一个使用 WCF 调用的 NET 3 5 应用程序 问题是到目前为止 我们无法分析这些调用中的方法 编写了一个 winforms 客户端应用程序来测试我们的系统 我们尝试使用ANTS 4 Profi
  • 如何使用 Qtimer 添加 1 秒延迟

    我目前有一个方法如下 void SomeMethod int a Delay for one sec timer gt start 1000 After one sec SomeOtherFunction a 这个方法实际上是一个附加到信号
  • 实体框架 - 循环更新属性

    我正在尝试找到一种方法来循环 EF 对象的属性并更新这些属性的值 更具体地说 我有 50 个字段 其中最多填充 50 个下拉列表 所有 50 个可能都需要填充 也可能不需要填充 为了解决这个问题 我有一个中继器 最多可以创建 50 个 DD
  • 如何使用movntdqa避免缓存污染?

    我正在尝试编写一个 memcpy 函数 该函数不会将源内存加载到 CPU 缓存中 目的是避免缓存污染 下面的 memcpy 函数可以工作 但会像标准 memcpy 一样污染缓存 我正在使用带有 Visual C 2008 Express 的
  • 每个 CPU 核心处于 C0 电源状态的时间

    任何帮助弄清楚如何做到这一点都会很棒 在过去一秒内 每个 CPU 核心处于 C0 电源状态的时间有多少 这是针对 Mac 应用程序的 因此需要 Objective C cocoa 和 c OS X 没有任何公开 CPU c 状态的 API
  • 无法使用 Unity 函数在 Visual Studio Code 中获得完整的 Intellisense

    好吧 我知道这个问题已经被问过并回答过很多次了 但我花了大约 3 天的时间试图解决这个问题 但到目前为止我所做的一切都没有奏效 我基本上在 Visual Studio Code 中有部分智能感知 也就是说 它似乎只识别 Unity 类和变量
  • 无法使用 ASP.NET Core 从 JWT 令牌获取声明

    我正在尝试使用 ASP NET Core 实现 JWT 持有者身份验证的非常简单的实现 我从控制器返回的响应有点像这样 var identity new ClaimsIdentity identity AddClaim new Claim
  • 无法更新 .mdf 数据库,因为该数据库是只读的(Windows 应用程序)

    我使用 C 创建了一个数据库 Windows 应用程序 我的应用程序在 Windows XP 上成功运行 但在 Vista 或 Windows 7 系统上无法正确执行 我的应用程序显示类似以下内容的消息 无法更新 mdf 数据库 因为该数据
  • WIX 自动生成 GUID *?

    假设我生成产品 ID 为 的 WIX XML 文件 另外 对于每个组件 GUID 我都使用
  • 使用 Thread.Sleep() 时,异步编程如何与线程一起工作?

    假设 前言 在之前的问题中 我们注意到Thread Sleep阻塞线程参见 什么时候使用Task Delay 什么时候使用Thread Sleep https stackoverflow com questions 20082221 whe
  • 使用经度和纬度查找给定距离内的所有附近客户

    我有一个包含客户经度和纬度的数据库 我有一个搜索表单 用户将在其中输入日志 纬度 距离下拉列表包含 50 英里 100 英里 当用户单击搜索时 我想编写一个 linq 查询从数据库中获取此距离半径内的所有客户 如何使用 C 和 linq 来
  • Xamarin 无法从异步获取实例

    我编写了一个通过蓝牙连接到 ESP32 的 Xamarin Forms 应用程序 现在我想从 MainPage xaml 页面的 CustomControl JoystickControl 获取值 我已经这样尝试过了 MainPage xa
  • 让 WIX 在项目中包含引用

    我对 WiX 和设置自定义安装程序完全陌生 所以我对问题的主题表示歉意 我有一个内部业务应用程序 日记 它构建并运行良好 因此我按照教程 官方文档添加 WiX 项目并引用日记的 csproj 然后构建并运行这个最基本版本的 WiX 安装程序
  • 发生错误。", ExceptionMessage: "提供的 'HttpContent' 实例无效

    尝试将文件添加到 http 休息调用时出现此错误 responseJson 消息 发生错误 ExceptionMessage 提供了无效的 HttpContent 实例 它确实 正在使用 多部分 参数名称 内容 异常类型 System Ar
  • 如何使用 Caliburn.Micro MVVM 将焦点设置到控件

    我有一个表单 我想在发生某些用户操作时将焦点设置到文本框 我知道 MVVM 的处理方式是绑定到 VM 属性 但是 TextBox 没有允许这种情况发生的属性 从虚拟机设置焦点的最佳方法是什么 我创建了一个 IResult 实现 可以很好地实
  • 专家 C#/.Net/WPF 开发人员应该了解哪些知识? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 无论表单上的焦点控件如何,如何捕获 Keys.F1?

    我使用了 KeyDown 事件和一些简单的代码 例如if e KeyCode Keys F1 捕获在表单上按下 F1 但如果表单上有一些文本框 或者表单上有一些带有 Dock Fill 的电子表格 则上面的代码将毫无用处并且不执行任何操作
  • 选择要重写哪个基类的方法

    鉴于以下情况 class Observer public virtual void Observe Parameter p 0 template
  • 为什么 OOP 中静态类的最佳实践有所不同?

    我目前正在阅读有关 Java 最佳实践的内容 我发现根据这本书 https rads stackoverflow com amzn click com 0321356683我们必须优先选择静态类而不是非静态类 我记得在 C 最佳实践中 我们
  • 如何并排显示 4 个三角形图案

    我无法让 4 个不同的三角形图案并排出现 这是一个控制台应用程序 这正是我试图通过使用嵌套 for 循环来实现的目标

随机推荐

  • 如何摆脱 Golang 中的无限循环

    我正在用 Go 编写一个程序来猜测随机数 我遇到了 for 循环的问题 我无法阻止 for 循环不断迭代 满足条件后如何跳出循环 for loop true fmt Println read number i n if i ans fmt
  • Xamarin 表单 HttpClient 卡住

    我正在尝试从 soundcloud API 获取响应 这是我的代码 public static async Task
  • 如何使用 Pandas 按月和年对行进行分组和计数?

    我有一个数据集 其中包含姓名 身高 体重和出生日期等个人数据 我会构建一个图表 其中包含特定月份和年份出生的人数 我使用 python pandas 来完成此任务 我的策略是尝试按年和月进行分组并使用计数进行添加 但我得到的最接近的是按年或
  • C++ 多重继承内存寻址问题

    请忽略 include 部分 假设它们已正确完成 另外 这可能是特定于实现的 但 vtable 的概念也是如此 但我只是很好奇 因为它增强了我可视化多重继承 顺便说一下 我使用的是MinGW 4 4 0 初始代码 class A publi
  • Spring boot WAR部署在Tomcat中启动失败

    我试图将 Spring Boot 应用程序打包为战争 但是当我尝试在 tomcat 中部署战争并尝试启动它时 它会抛出一个异常 指出异常启动过滤器 java lang AbstractMethodError 我的Spring boot版本是
  • Objective-C - char 和 unichar 之间的区别?

    我搜索了很多关于差异的信息unichar and char但没有得到任何明确的概念 还告诉我差异char and unichar 使用时char and unichar char是 8 位 表示任意 8 位数字 UTF 8 代码单元或其他字
  • 我如何终止 iphone 中的 api 调用

    我是 iPhone 新手 我遇到了一个新问题 我的应用程序中有一个 api 交互 该 api 需要很长时间才能加载 当我手动终止我的应用程序时 在加载该 api 时我的应用程序关闭 然后我会打开我的应用程序 它会立即关闭 任何人都可以帮助我
  • 单击按钮 Xamarin.forms 将子项添加到父项

    我一直在尝试在 Android 中单击按钮时将标签视图添加到堆栈布局中 但它会抛出空指针异常 以下是我想要实现的目标 任何人都可以请建议如何在 xamarin forms 中实现这一目标 C 中的 Xamarin Forms 代码 Stac
  • 将 postgresql hstore 转换为 php 数组

    是否有一个好的 php 代码片段可以将 postgresql hstore 转换为 php 数组 它将正确地将 hstore 中未加引号的 NULL 转换为 php NULL EG 假设我们有以下 hstore 字符串 k1 gt v1 k
  • Xcode 7 不再有配置文件刷新按钮 - 那么如何将新的设备 ID 添加到配置文件中?

    我刚刚向配置门户添加了一个新设备 以前 下一步是手动更新相关配置文件以添加此新设备 但现在似乎这是由 Xcode 自动处理的 并且不再可能通过配置门户编辑配置文件以包含新设备 门户中不再有编辑按钮 好的 但是最新版本的 Xcode Xcod
  • 对静态函数的未定义引用

    当我在 A 类中创建一个静态函数并且我想从 B 类函数中调用它时 我遇到了一个奇怪的问题 我明白了 对 A funcA int 的未定义引用 这是我的源代码 a cpp include a h void funcA int i std co
  • 如何在flutter中检索sqlite数据库中的图像数据?

    我想在 sqlite 中检索图像数据 我使用下面的代码 var image await ImagePicker pickImage source imageSource List
  • 片段中的 MapActivity

    我有一个FragmentActivity public class parking extends FragmentActivity 它有 3 个选项卡 第二个和第三个是列表 已解决 public class tab2 extends Fr
  • Java中如何从另一个类获取类的特定实例?

    我创建了以下课程main方法 它创建新的实例Application和实例ApplicationModel ApplicationView and ApplicationController对于这个特殊的Application public
  • Shiny 应用程序中的“read_excel”

    我有一个闪亮的应用程序 使用read xlsx包中的函数xlsx 一切正常 但我想改为read excel from readxl 希望它会更快并且能够应对大文件 ui part fileInput inputFile Upload fil
  • 手部检测 Opencv

    我正在尝试使用 OpenCV 和 C 检测手 我能够找到图像中存在人手的手的轮廓 正图像 基本上我找到最大的轮廓并将其视为手部轮廓 假设在给定的图像中不存在手 那么我将采用任何轮廓并将其视为手 所以我开始思考我可以使用 haar 级联来确定
  • 反应式框架/DoubleClick

    我知道有一个简单的方法可以做到这一点 但今晚它打败了我 我想知道两个事件是否在 300 毫秒内发生 例如双击 在 300 毫秒内单击鼠标左键两次 我知道这就是响应式框架的构建目的 但该死的是 如果我能找到一个好的文档 其中包含所有扩展运算符
  • 使用 conda 安装 opencv

    这个问题与 如何通过Conda安装Python OpenCV 不同 因为这个问题是 5 年前提出的 当时所有软件包都有不同的版本 我尝试了该问题的所有答案 但都不起作用 有关详细信息 请参阅问题正文 现在 2019 年 7 月 如何使用 c
  • 用于解析日期/时间字符串(包括时区)的 C++ 库(unix)

    我有多种格式的日期 现在我想在 C 中有一个函数 来自某个库 它可以解析这些日期 时间字符串 并给我一些像 tm 这样的结构 或者将它们转换为某种确定性表示 以便我可以处理日期 时间 我看到的一些格式如下 2008 年 2 月 19 日星期
  • 是否可以用 C++ 编写敏捷的 Pimpl?

    我一直在研究 Pimpl 习语并从中获得了各种好处 我唯一不太感兴趣的是定义函数时的感觉 一旦进入标题 P def 一旦到达 cpp 的顶部 Impl def 一旦进入 cpp Impl Impl 中间 一旦到达 cpp 的下端 P Imp