9得票1回答
Pimpl技法比始终使用unique_ptr作为成员变量更好吗?

在我的工作场所,我们有这样的约定:几乎每个类(有极少数例外)都是使用 unique_ptr、原始指针或引用作为成员变量实现的。 这是由于编译时间的原因:以这种方式,您只需要在头文件中对类进行前向声明,并且您只需要在 cpp 中包含文件。此外,如果您更改了包含 unique_ptr 的类的 ....

9得票7回答
pimpl技巧如何减少依赖性?

请看以下内容: 考虑以下情况: PImpl.hpp class Impl; class PImpl { Impl* pimpl; PImpl() : pimpl(new Impl) { } ~PImpl() { delete pimpl; } void ...

8得票4回答
使用PIMPL技巧时,有没有办法限制重复的样板代码?

我有类似以下的内容: // foo.h: class foo { public: foo(); ~foo(); // note: the param type repetition here is only incidental, assume the //...

8得票6回答
在C++中,你使用哪些模式来解耦接口和实现?

在大型C++项目中,一个问题就是编译时间过长。你的依赖树中有一些高层类需要进行修改,但通常你会避免这样做,因为每次编译都需要花费很长时间。你不一定想改变它的公共接口,但也许你想改变它的私有成员(添加缓存变量,提取私有方法等)。问题在于,在C++中,即使是私有成员,也要在公共头文件中声明,所以你...

8得票4回答
在C++中编写一个灵活的Pimpl是否可能?

我一直在使用Pimpl技巧,并从中获得了各种好处。唯一让我不太喜欢的是定义函数时的感觉。 头文件中一次(P def) .cpp文件顶部一次(Impl def) .cpp文件中间一次(Impl Impl) .cpp文件底部一次(P Impl) 我真的很享受减少代码差异和冗余的过程,但是当...

8得票2回答
Pimpl + QSharedPointer - 析构函数 = 灾难

昨天我遇到了一件令人沮丧的事情,让我花费了24个小时的挣扎。问题归结为出现了随机的崩溃。更加复杂的是,调试报告也完全没有规律。更加复杂的是,所有的调试信息都指向随机的Qt源代码或本地DLL文件,即每次都证明问题不在我的端上。以下是一些这样可爱的报告示例: Program received s...

8得票1回答
使用shared_ptr的Pimpl惯用法处理不完整类型

我正在阅读Scott Meyers的《Effective Modern C++》,他讨论了pimpl惯用法,并使用unique_ptr指向实现类,但是存在特殊成员函数(例如析构函数)需要类型完整的问题。这是因为unique_ptr的默认删除器在使用delete p之前静态断言要删除的类型是否完...

7得票1回答
有没有一种方法可以结合编译器防火墙(Pimpl)和默认可复制性的优点?

假设我有一个类,其中有一个私有成员,这是客户端不关心的实现细节。该类是一个值类型,我们希望它可以被复制,例如: #include <boost/bimap.hpp> // some header that pulls in many other files class MyC...

7得票2回答
在C++头文件中保持私有部分不可见:纯虚基类 vs PIMPL

我最近从Java和Ruby切换回C++,令我惊讶的是,当我更改私有方法的方法签名时,必须重新编译使用公共接口的文件,因为私有部分也在.h文件中。 我很快想出了一个解决方案,这对于Java程序员来说可能很典型:接口(=纯虚基类)。例如: BananaTree.h: class Banana...

7得票3回答
为什么pimpl应该声明为struct而不是class?

“使用Pimpl模式(来自Herb Sutter的《Exceptional C++》)的规范形式如下: class X { public: /* ... public members ... */ protected: /* ... protected members? ... */ ...