问题标签 [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.
c++ - 用于模板类的 pimpl
我想使用 pimpl 习惯用法来避免我的库的用户需要我们的外部依赖项(如 boost 等),但是当我的类被模板化时,这似乎是不可能的,因为方法必须在标题中。有什么我可以做的吗?
c++ - 便携式C++对齐?
我想将 Pimpl 成语与本地存储成语一起应用:
我的类型.h
我的类型.cpp
我对这种方法唯一关心的是对齐m_storage
。char
不保证以与 int 相同的方式对齐。原子可能有更严格的对齐要求。我正在寻找比 char 数组更好的东西来声明存储,它使我能够定义(和断言)对齐值。你知道这样的事吗?也许一个boost库已经这样做了?
c++ - pimpl 助手与继承不明确
我正在为 pimpl 习惯用法创建一个实用程序类,但是我有一些问题希望得到一些帮助:
这就是我所拥有的:
[sehe:另请参见此处的 rev.1:https ://gist.github.com/1379569/9f6cca5703e6195da65e34103393d901dde3b1bf ]
pimpl.h
pimpl_impl.h
这就是你使用它的方式:
A.h
A.cpp
这工作得很好,但是当您将继承放入图片时它很快就会崩溃:
pimpl
变得暧昧了……
关于如何避免这种情况的任何想法?
c++ - 模板中的 pimpl-idiom;哪个智能指针?
我通常将 boost::scoped_ptr 用于 pimpl(原因之一是因为如果我忘记处理复制构造函数,我不会感到惊讶)
但是,对于模板,我不能只将析构函数放在完全定义 impl 的 cpp 文件中,以满足 scoped_ptr 析构函数的要求。无论如何它确实有效,但我不确定它是保证有效还是偶然。是否有一些“最佳实践”或标准?scoped_ptr 是不可复制类中 pimpls 的最佳智能指针吗?
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()
delete
widget::impl
请解释是什么迫使编译器在完整的上下文中生成特殊成员widget::impl
。因为我看不出这是如何工作的。
widget::~widget()
如果 GotW #101 仍然需要在实现文件中明确定义widget::impl
,那么请解释“更强大”的评论(@sehe 在他的回答中引用)。
我正在查看 GotW #101 的核心主张,即包装“消除了一些样板文件”,在我看来(基于本段的其余部分)意味着widget::~widget()
声明和定义。所以请不要在你的答案中依赖它,在 GotW #101 中,那已经消失了!
Herb,如果您路过,请让我知道是否可以在此处剪切+粘贴解决方案代码以供参考。
c++ - 必须在 PIMPL 中提供析构函数
上述编译错误的解决方法是手动提供析构函数。指出的原因如下:
您仍然必须记住手动定义析构函数;原因是在编译器生成隐式析构函数时,类型 impl 不完整,因此不会调用其析构函数。
问题> 我仍然难以吸收上述想法,想知道一点细节,为什么我们必须在这里提供手动析构函数。
谢谢
c++ - PIMPL 成语真的在实践中使用吗?
我正在阅读 Herb Sutter 的“Exceptional C++”一书,在那本书中我了解了 PIMPL 习语。基本上,这个想法是为 a 的private
对象创建一个结构class
并动态分配它们以减少编译时间(并以更好的方式隐藏私有实现)。
例如:
可以改为:
并且,在 .cpp 文件中,定义:
这看起来很有趣,但我以前从未见过这种方法,无论是在我工作过的公司中,还是在我看过源代码的开源项目中。所以,我想知道这种技术是否真的在实践中使用?
我应该在任何地方使用它,还是谨慎使用?是否建议将此技术用于嵌入式系统(性能非常重要)?
c++ - 如何将 unique_ptr 用于 pimpl?
这是我尝试将 unique_ptr 用于 pimpl 时看到的简化。我选择 unique_ptr 是因为我真的希望类拥有指针 - 我希望 pimpl 指针和类的生命周期相同。
无论如何,这是标题:
这是来源:
我可以将它们编译成一个库就好了。但是当我尝试在测试程序中使用它时,我得到了
这是众所周知的安全功能。我试着跟了上去。
我的问题是,如果我将 Help::Impl 声明放在标题中,它似乎会消除 pimpl 的任何优势。类布局对用户可见。定义是隐藏的,但我可以使用 Help 类和私有成员来做到这一点。此外,包括 Impl 的声明带来了我希望分开的新标头。
我错过了什么?人们在 Impl 声明中添加了什么以及在哪里?我做错了 Help dtor 吗?啊!
c++ - 将 pImpl 指针转换回调用者类型
我在我的程序中使用 pimpl idiom 并且我被困在一个地方。我的代码是
在我的 ClassImpl->GetP() 我有
如您所见,我需要将我的 pImpl bact 转换为我的调用者类型。方法是什么?
我不想使用任何铸造
请咨询
c++ - 如何从 pimpl 类调用调用者类的复制构造函数?
我只需要知道我是否想从 pImpl 类中调用我的 copyconstructor,我该怎么做?例如:
我怎样才能做到这一点?