草庐IT

c++ - std::auto_ptr 或 boost::shared_ptr 用于 pImpl 成语?

使用pImplidiom时是否最好使用boost:shared_ptr而不是std::auto_ptr?我确定我曾经读过boost版本对异常更友好?classFoo{public:Foo();private:structimpl;std::auto_ptrimpl_;};classFoo{public:Foo();private:structimpl;boost::shared_ptrimpl_;};[编辑]使用std::auto_ptr是否总是安全的,或者是否存在需要替代boost智能指针的情况? 最佳答案 您不应该为此使用std

c++ - 将 const std::unique_ptr 用于 pimpl 习惯用法

在HerbSutter'stalkatCppCon16他建议用conststd::unique_ptr编写pimplidiom(大约10分钟)。这应该如何与移动构造函数/赋值一起使用?c++17中有什么东西吗?我找不到任何东西。 最佳答案 如果您的类应该是永不为空的,那么非常量的唯一ptr(具有默认移动/分配)是不合适的。movector和moveassign都会清空rhs。一个constuniqueptr将禁用这些自动方法,如果你想移动,你必须在impl中编写它(并在外面有点胶水)。我会亲自编写一个具有我想要的语义的值ptr(然后

c++ - dll 中的 std::unique_ptr pimpl 使用 Visual Studio 生成 C4251

这不是一个重大问题,但我喜欢从警告中清除我的代码,所以这让我很紧张。我一直在使用c++11版本的pimplidiom以通常的方式隐藏我的库的类实现。//dllheaderclassFrameworkImpl;classEXPORT_APIFramework{Framework(constFramework&)=delete;Framework&operator=(constFramework&)=delete;Framework(Framework&&)=delete;Framework&operator=(Framework&&)=delete;public:Framework();

c++ - Pimpl - 为什么可以在不完整的类型上调用 make_unique

为什么make_unique调用会编译?make_unqiue不要求它的模板参数是一个完整的类型吗?structF;intmain(){std::make_unique();}structF{};问题源于我的PIMPL实现的“问题”:我确实理解为什么必须在实现类(PIMPL)的cpp文件中由用户声明和定义析构函数。但是移动包含pimpl-的类的构造函数仍然可以编译。classObject{};classCachedObjectFactory{public:CachedObjectFactory();~CachedObjectFactory();std::shared_ptrcreate

c++ - 实践中的 Pimpl 成语

关于pimplidiom有一些关于SO的问题,但我更好奇它在实践中的使用频率。我了解在性能和封装之间需要权衡取舍,另外由于额外的重定向会导致一些调试烦恼。这样,这是应该在每个类(class)还是全有或全无的基础上采用的东西?这是最佳实践还是个人偏好?我意识到这有点主观,所以让我列出我的首要任务:代码清晰代码可维护性性能我总是假设我需要在某个时候将我的代码公开为一个库,所以这也是一个考虑因素。编辑:欢迎提出任何其他选项来完成同样的事情。 最佳答案 我想说的是,您是按类(class)还是全有或全无的基础上进行这取决于您首先选择pimpl

c++ - Pimpl 成语 vs 纯虚拟类接口(interface)

我想知道是什么让程序员选择Pimpl习惯用法或纯虚拟类和继承。我知道pimplidiom为每个公共(public)方法和对象创建开销都提供了一个显式的额外间接。另一方面,纯虚拟类带有用于继承实现的隐式间接(vtable),我知道没有对象创建开销。编辑:但是如果您从外部创建对象,则需要一个工厂是什么让纯虚类不如pimpl成语那么受欢迎? 最佳答案 在写C++类的时候,适当考虑一下会不会是值类型按值(value)复制,身份从来都不重要。它适合作为std::map中的键。例如,“字符串”类,或“日期”类,或“复数”类。“复制”此类的实例是

c++ - 为什么要使用 "PIMPL"成语?

这个问题在这里已经有了答案:IsthePIMPLidiomreallyusedinpractice?(12个回答)关闭7年前。背景:PIMPLIdiom(指向IPLementation的指针)是一种实现隐藏技术,其中公共(public)类包装了在公共(public)类所属的库之外无法看到的结构或类。这对库的用户隐藏了内部实现细节和数据。在实现这个习惯用法时,为什么要将公共(public)方法放在pimpl类而不是公共(public)类上,因为公共(public)类的方法实现将被编译到库中,而用户只有头文件?为了说明,这段代码将Purr()实现放在了impl类上,并将其包装起来。为什么不

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

我正在阅读HerbSutter的“ExceptionalC++”一书,在这本书中我了解了PIMPL习语。基本上,这个想法是为class的private对象创建一个结构并动态分配它们以减少编译时间(同时隐藏以更好的方式私有(private)实现)。例如:classX{private:Cc;Dd;};可以改为:classX{private:structXImpl;XImpl*pImpl;};并且,在.cpp文件中,定义:structX::XImpl{Cc;Dd;};这看起来很有趣,但我以前从未见过这种方法,无论是在我工作过的公司中,还是在我看过源代码的开源项目中。所以,我想知道这种技术是否

c++ - pimpl idiom vs. bridge 设计模式

我刚刚注意到一个新术语pimplidiom,这个idiom与Bridge设计模式有什么区别?我对此感到困惑。我还注意到pimpl惯用语总是用于交换功能,那是什么?谁能举个例子? 最佳答案 PIMPL是一种隐藏实现的方式,主要是为了打破编译依赖。另一方面,桥接模式是一种支持多种实现的方式。swap是一个标准的C++函数,用于交换两个对象的值。如果将指向实现的指针交换为不同的实现,则本质上是在运行时更改类的机制。但在其基本和通用形式中,使用PIMPL的类指向单个实现,因此不存在具有不同子类的抽象类——只有一个类,前向声明并在别处编译。更

c++ - pimpl idiom vs. bridge 设计模式

我刚刚注意到一个新术语pimplidiom,这个idiom与Bridge设计模式有什么区别?我对此感到困惑。我还注意到pimpl惯用语总是用于交换功能,那是什么?谁能举个例子? 最佳答案 PIMPL是一种隐藏实现的方式,主要是为了打破编译依赖。另一方面,桥接模式是一种支持多种实现的方式。swap是一个标准的C++函数,用于交换两个对象的值。如果将指向实现的指针交换为不同的实现,则本质上是在运行时更改类的机制。但在其基本和通用形式中,使用PIMPL的类指向单个实现,因此不存在具有不同子类的抽象类——只有一个类,前向声明并在别处编译。更