草庐IT

pimpl-idiom

全部标签

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的类指向单个实现,因此不存在具有不同子类的抽象类——只有一个类,前向声明并在别处编译。更

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

这是我尝试将unique_ptr用于pimpl时所看到的简化。我选择unique_ptr是因为我真的希望类拥有指针-我希望pimpl指针和类的生命周期相同。不管怎样,这是标题:#ifndefHELP#defineHELP1#includeclassHelp{public:Help(intii);~Help()=default;private:classImpl;std::unique_ptr_M_impl;};#endif//HELP这里是来源:#include"Help.h"classHelp::Impl{public:Impl(intii):_M_i{ii}{}private:in

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

这是我尝试将unique_ptr用于pimpl时所看到的简化。我选择unique_ptr是因为我真的希望类拥有指针-我希望pimpl指针和类的生命周期相同。不管怎样,这是标题:#ifndefHELP#defineHELP1#includeclassHelp{public:Help(intii);~Help()=default;private:classImpl;std::unique_ptr_M_impl;};#endif//HELP这里是来源:#include"Help.h"classHelp::Impl{public:Impl(intii):_M_i{ii}{}private:in

ios - 在 Swift 中使用 UI_USER_INTERFACE_IDIOM() 检测当前设备

在Swift中检测iPhone和iPad之间的UI_USER_INTERFACE_IDIOM()的等价物是什么?在Swift中编译时出现Useofunresolvedidentifier错误。 最佳答案 使用Swift时,可以使用enumUIUserInterfaceIdiom,定义为:enumUIUserInterfaceIdiom:Int{caseunspecifiedcasephone//iPhoneandiPodtouchstyleUIcasepad//iPadstyleUI(alsoincludesmacOSCatalys

ios - 在 Swift 中使用 UI_USER_INTERFACE_IDIOM() 检测当前设备

在Swift中检测iPhone和iPad之间的UI_USER_INTERFACE_IDIOM()的等价物是什么?在Swift中编译时出现Useofunresolvedidentifier错误。 最佳答案 使用Swift时,可以使用enumUIUserInterfaceIdiom,定义为:enumUIUserInterfaceIdiom:Int{caseunspecifiedcasephone//iPhoneandiPodtouchstyleUIcasepad//iPadstyleUI(alsoincludesmacOSCatalys
78910