问题标签 [pimpl-idiom]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
11090 浏览

c++ - 用于模板类的 pimpl

我想使用 pimpl 习惯用法来避免我的库的用户需要我们的外部依赖项(如 boost 等),但是当我的类被模板化时,这似乎是不可能的,因为方法必须在标题中。有什么我可以做的吗?

0 投票
3 回答
996 浏览

c++ - 便携式C++对齐?

我想将 Pimpl 成语与本地存储成语一起应用:


我的类型.h


我的类型.cpp


我对这种方法唯一关心的是对齐m_storagechar不保证以与 int 相同的方式对齐。原子可能有更严格的对齐要求。我正在寻找比 char 数组更好的东西来声明存储,它使我能够定义(和断言)对齐值。你知道这样的事吗?也许一个boost库已经这样做了?

0 投票
1 回答
450 浏览

c++ - pimpl 助手与继承不明确

我正在为 pimpl 习惯用法创建一个实用程序类,但是我有一些问题希望得到一些帮助:

这就是我所拥有的:
[sehe:另请参见此处的 rev.1:https ://gist.github.com/1379569/9f6cca5703e6195da65e34103393d901dde3b1bf ]

pimpl.h

pimpl_impl.h

这就是你使用它的方式:

A.h

A.cpp

这工作得很好,但是当您将继承放入图片时它很快就会崩溃:

pimpl变得暧昧了……

关于如何避免这种情况的任何想法?

0 投票
3 回答
2273 浏览

c++ - 模板中的 pimpl-idiom;哪个智能指针?

我通常将 boost::scoped_ptr 用于 pimpl(原因之一是因为如果我忘记处理复制构造函数,我不会感到惊讶)

但是,对于模板,我不能只将析构函数放在完全定义 impl 的 cpp 文件中,以满足 scoped_ptr 析构函数的要求。无论如何它确实有效,但我不确定它是保证有效还是偶然。是否有一些“最佳实践”或标准?scoped_ptr 是不可复制类中 pimpls 的最佳智能指针吗?

0 投票
2 回答
2126 浏览

c++ - GotW #101“解决方案”真的解决了什么问题吗?

首先阅读 Herb 的 Sutters GotW 关于 C++11 中 pimpl 的帖子:

我在理解 GotW #101 中提出的解决方案时遇到了一些麻烦。据我所知,GotW #100 中辛苦解决的所有问题都卷土重来:

  • 成员是离线模板,并且定义在pimpl使用点不可见(在class widget的类定义和隐式生成的特殊成员函数中widget)。也没有任何明确的实例化。这将在链接期间导致未解决的外部错误。

  • widget::impl在定义实例化的地方仍然不完整pimpl<widget::impl>::~pimpl()(我认为它实际上根本没有实例化,只是被引用)。因此调用指向不完整类型的指针,如果具有非平凡的析构函数,则会产生未定义的行为。std::unique_ptr<widget::impl>::~unique_ptr()deletewidget::impl

请解释是什么迫使编译器在完整的上下文中生成特殊成员widget::impl。因为我看不出这是如何工作的。


widget::~widget()如果 GotW #101 仍然需要在实现文件中明确定义widget::impl,那么请解释“更强大”的评论(@sehe 在他的回答中引用)。

我正在查看 GotW #101 的核心主张,即包装“消除了一些样板文件”,在我看来(基于本段的其余部分)意味着widget::~widget()声明和定义。所以请不要在你的答案中依赖它,在 GotW #101 中,那已经消失了!


Herb,如果您路过,请让我知道是否可以在此处剪切+粘贴解决方案代码以供参考。

0 投票
1 回答
2016 浏览

c++ - 必须在 PIMPL 中提供析构函数

上述编译错误的解决方法是手动提供析构函数。指出的原因如下:

您仍然必须记住手动定义析构函数;原因是在编译器生成隐式析构函数时,类型 impl 不完整,因此不会调用其析构函数。

问题> 我仍然难以吸收上述想法,想知道一点细节,为什么我们必须在这里提供手动析构函数。

谢谢

0 投票
12 回答
32797 浏览

c++ - PIMPL 成语真的在实践中使用吗?

我正在阅读 Herb Sutter 的“Exceptional C++”一书,在那本书中我了解了 PIMPL 习语。基本上,这个想法是为 a 的private对象创建一个结构class并动态分配它们以减少编译时间(并以更好的方式隐藏私有实现)。

例如:

可以改为:

并且,在 .cpp 文件中,定义:

这看起来很有趣,但我以前从未见过这种方法,无论是在我工作过的公司中,还是在我看过源代码的开源项目中。所以,我想知道这种技术是否真的在实践中使用?

我应该在任何地方使用它,还是谨慎使用?是否建议将此技术用于嵌入式系统(性能非常重要)?

0 投票
2 回答
20158 浏览

c++ - 如何将 unique_ptr 用于 pimpl?

这是我尝试将 unique_ptr 用于 pimpl 时看到的简化。我选择 unique_ptr 是因为我真的希望类拥有指针 - 我希望 pimpl 指针和类的生命周期相同。

无论如何,这是标题:

这是来源:

我可以将它们编译成一个库就好了。但是当我尝试在测试程序中使用它时,我得到了

这是众所周知的安全功能。我试着跟了上去。

我的问题是,如果我将 Help::Impl 声明放在标题中,它似乎会消除 pimpl 的任何优势。类布局对用户可见。定义是隐藏的,但我可以使用 Help 类和私有成员来做到这一点。此外,包括 Impl 的声明带来了我希望分开的新标头。

我错过了什么?人们在 Impl 声明中添加了什么以及在哪里?我做错了 Help dtor 吗?啊!

0 投票
1 回答
259 浏览

c++ - 将 pImpl 指针转换回调用者类型

我在我的程序中使用 pimpl idiom 并且我被困在一个地方。我的代码是

在我的 ClassImpl->GetP() 我有

如您所见,我需要将我的 pImpl bact 转换为我的调用者类型。方法是什么?

我不想使用任何铸造
请咨询

0 投票
1 回答
1378 浏览

c++ - 如何从 pimpl 类调用调用者类的复制构造函数?

我只需要知道我是否想从 pImpl 类中调用我的 copyconstructor,我该怎么做?例如:

我怎样才能做到这一点?