Pimpl 习语的实践

2024-03-22

SO 上有一些关于粉刺成语,但我更好奇它在实践中被利用的频率是多少。

我知道性能和封装之间存在一些权衡,再加上额外的重定向带来的一些调试烦恼。

那么,这是应该在每个班级中采用,还是全有或全无的基础上采用?这是最佳实践还是个人偏好?

我意识到这有点主观,所以让我列出我的首要任务:

  • 代码清晰
  • 代码可维护性
  • 表现

我总是假设我需要在某个时候将我的代码公开为库,所以这也是一个考虑因素。

EDIT:任何其他完成同样事情的选择都是受欢迎的建议。


我想说的是,你是否在每堂课上这样做,还是在全有或全无的基础上进行,取决于你首先为什么选择 pimpl 习惯用法。我在建立图书馆时的原因是以下之一:

  • 想要隐藏实施以避免泄露信息(是的,这不是一个 FOSS 项目:)
  • 想要隐藏实现以使客户端代码更少依赖。如果您构建共享库 (DLL),则可以更改 pimpl 类,甚至无需重新编译应用程序。
  • 希望减少使用该库编译类所需的时间。
  • 想要修复命名空间冲突(或类似的)。

这些原因都不会促使我们采取“全有或全无”的方法。在第一种情况下,您只需简化要隐藏的内容,而在第二种情况下,对于您希望更改的类来说,这样做可能就足够了。另外,出于第三个和第四个原因,隐藏重要的成员只会带来好处,而这些成员又需要额外的标头(例如,第三方库,甚至 STL 的标头)。

无论如何,我的观点是,我通常不会发现这样的东西太有用:

class Point {
  public:      
    Point(double x, double y);
    Point(const Point& src);
    ~Point();
    Point& operator= (const Point& rhs);

    void setX(double x);
    void setY(double y);
    double getX() const;
    double getY() const;

  private:
    class PointImpl;
    PointImpl* pimpl;
}

在这种情况下,您需要权衡,因为需要取消引用指针,并且无法内联方法。但是,如果您仅对重要的类执行此操作,那么通常可以容忍轻微的开销,不会出现任何问题。

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

Pimpl 习语的实践 的相关文章

随机推荐

  • NestJS,如何以及在哪里构建响应 DTO

    我一直在使用Java Spring框架来开发微服务 最近 我开始探索 NestJS 并有一个关于构建响应 DTO 的问题 在春天 控制器是轻量级的 它们将调用交给服务层 服务层实现业务逻辑 最后 它们调用负责构建响应 DTO 的 Mappe
  • 在 d3.js 中绘制滚动/移动平均值

    寻找一种在 d3 中绘制滚动 移动平均值的方法 而无需提前操作数据 所以我想通过对每个数据点及其后面的两个数据点进行平均来平滑这条线 我的代码是这样的 var data 3 66 2 76 5 20 1 3 8 90 2 5 70 var
  • 当应用程序处于后台/未运行时,不打开通知单击上的特定活动

    仅当打开应用程序并执行通知单击时 通知单击才会启动指定的活动 如果应用程序处于后台 未运行并且执行了通知单击 则应用程序的 MainActivity 将打开 简而言之 就像应用程序按照 Activity 堆栈正常打开一样 而不是打开 Pen
  • 填充无效且无法移除

    来自评论 一旦我手动将填充设置为 无 问题就消失了 这段代码有什么问题吗 VS2010确实可以编译它 但是从VS2010运行时出现错误 说cs close 填充无效 有人可以帮忙吗 谢谢 public static byte Decrypt
  • 如何从javascript中的字符串中删除“,”

    原始字符串是 a d k 我想删除所有 并使其达到 adk 我尝试了下面的代码 但它不起作用 a d k replace 您没有将替换方法的结果分配回您的变量 当您调用replace时 它会返回一个新字符串 而不修改旧字符串 例如 将其加载
  • Wordpress - 选择/加载子菜单项页面时突出显示父菜单项

    我有一个基本菜单 一些菜单项有子菜单 我对 WordPress 的经验很少 现在没有时间深入研究细节 所以我的问题是 当用户导航到子菜单页面之一时突出显示顶部菜单项的最简单方法是什么 我尝试使用 javascript 和纯 css 通过元素
  • 具有动态高度的 CSS 三角形

    想知道是否有人可以帮助解决我遇到的 css 问题 请参阅此 jsbin http jsbin com uviyat 2 edit http jsbin com uviyat 2 edit 注意 较长的措辞示例 如何使三角形箭头指示器垂直缩放
  • 从 XSL 创建 XSL

    我正在尝试从 XSLT 样式表动态生成 XSLT 文档 当然 原则上这是可行的 但我没有让命名空间正常工作 我希望生成的 XSLT 元素带有 xsl 前缀
  • jquery ui滑块,如果满足某些条件则停止滑动

    使用 jQuery UI Slider 我试图找出如何使滑块在满足某些条件后停止工作 有任何想法吗 我认为在 开始 部分停止事件传播会起作用 但是 事实并非如此 所以我还是一无所知 迷失了方向
  • 您可以使用 RedirectToAction 传递模型吗?

    我正在使用 mvc 2 候选版本 并且想知道是否有任何方法可以使用 RedirectToAction 将模型传递给操作 例如 我有一个编辑操作 它采用 ID 从数据库加载记录 在文本框中显示当前值 并让用户编辑并单击提交 public Ac
  • 无法在 Zsh 中使用颜色;文字有效,但没有出现颜色

    我刚买了一台 Mac 我正在尝试用颜色自定义我的 Zsh 提示符 但我无法让颜色起作用 我不确定是因为 LS COLORS 还是什么原因 这是我的 zshrc export CLICOLOR 1 export LSCOLORS ExFxBx
  • C# 没有私有变量的自定义 getter/setter

    我最近学习了c 所以当我学习写属性时 我被教这样做 public string Name get set 汽车属性太棒了 但现在我想做一些更复杂的事情 所以我需要编写一对自定义访问器 private string Name public s
  • 在 for 循环中重新创建 ArrayList 的最快方法

    在Java中 对一个巨大的矩阵X使用以下函数来打印其列不同的元素 create the list of distinct values List
  • 我应该如何订购 DI/IOC 的 ctor 参数?

    我是一个 DI 新手 所以如果这是错误的方法或一个愚蠢的问题 请原谅我 假设我有一个创建 更新订单的表单 并且我知道它将需要检索要显示的产品和客户列表 我想传递它正在编辑的 Order 对象 但我还想注入 ProductsService 和
  • 作为 Windows 服务运行时,如何获取活动监视器的数量? C++

    当 exe 作为 Windows 服务运行时 我在检索活动监视器的数量时遇到了问题 我尝试使用 EnumDisplayDevices 和 GetSystemMetrics SM CMONITROS 来获取监视器的数量 这两种方法在以控制台模
  • 如何更改本地sql server sa密码?

    我是计算机的本地管理员 如何更改本地安装的 sql server 2008 的 sa 密码 注意 我不知道sa帐户的密码 该线程的回复确实很晚 但我刚刚丢失并重置了 SA 的密码 按照以下简单步骤操作即可完成 在 Windows 身份验证模
  • Facebook Like Box:如何检测用户是否已经喜欢该页面?

    我在我的博客中安装了 Like Box 我想知道用户是否已经喜欢我的页面 我想向我的读者实现这样的东西 因为如果他们已经喜欢我的页面 我想向他们提供隐藏的内容 是否有一个事件可以检测用户是否已经喜欢 赞 框中的页面 如果您使用的是 XFBM
  • 如何将 Springdoc Swagger UI 指向我自己的 YAML 文件而不是自动生成的文件?

    我创建了一个 Spring Boot RESTFul 微服务 对于文档 我创建了一个 swagger yaml 文件 但我不知道如何运行该文件 为了创建 swagger yaml 文件 我使用了 OpenAPI 规范 我知道我们有一个 Sw
  • 长数组列表渲染使 Angular.js 中的页面滚动变慢

    当尝试从数组 带有图像 渲染超过 120 个项目时滚动列表的速度变慢 基本上 当我在无限滚动中加载新数据时 我会将旧数组数据与新数组数据连接起来 另一方面 像 dribbble behance 这样的流行网站似乎没有这个问题 也许这个问题是
  • Pimpl 习语的实践

    SO 上有一些关于粉刺成语 但我更好奇它在实践中被利用的频率是多少 我知道性能和封装之间存在一些权衡 再加上额外的重定向带来的一些调试烦恼 那么 这是应该在每个班级中采用 还是全有或全无的基础上采用 这是最佳实践还是个人偏好 我意识到这有点