我想知道是什么让程序员选择Pimpl惯用法或纯虚拟类和继承。
我知道pimpl惯用法为每个公共方法和对象创建开销提供了一个显式的额外间接地址。
另一方面,Pure虚拟类为继承实现提供了隐式的间接性(Vtable),我知道没有创建对象的开销。
编辑:但是如果您从外部创建对象,则需要一个工厂
是什么让纯虚拟类不如pimpl习惯用法那么可取呢?
发布于 2009-05-05 15:15:04
在编写C++类时,应该考虑它是否将是
按值复制,身份从来都不重要。它适合作为std::map中的一个键。例如,"string“类,或"date”类,或"complex number“类。“复制”这样一个类的实例是有意义的。
身份很重要。总是通过引用传递,从不通过"value“传递。通常,“复制”类的实例是没有意义的。当它确实有意义时,多态的“克隆”方法通常更合适。示例:套接字类、数据库类、“策略”类,以及函数式语言中的任何“闭包”。
pImpl和纯抽象基类都是减少编译时依赖性的技术。
然而,我只使用pImpl来实现值类型(类型1),而且只有在我真正想要最小化耦合和编译时依赖时才使用它。通常,这是不值得的。正如您正确地指出的那样,有更多的语法开销,因为您必须为所有的公共方法编写转发方法。对于类型2类,我总是使用带有关联工厂方法的纯抽象基类。
发布于 2009-05-05 14:09:01
Pointer to implementation
通常是关于隐藏结构化实现细节的。Interfaces
是关于实例化不同的实现。它们实际上有两个不同的目的。
发布于 2009-05-05 14:12:39
pimpl惯用法可以帮助您减少构建依赖和构建时间,特别是在大型应用程序中,并最大限度地减少类的实现细节在一个编译单元中的头部暴露。您的类的用户甚至不需要知道粉刺的存在(除非是他们不了解的隐秘指针!)。
抽象类(纯虚拟)是你的客户必须知道的东西:如果你试图使用它们来减少耦合和循环引用,你需要添加一些方法来允许它们创建你的对象(例如,通过工厂方法或类,依赖注入或其他机制)。
https://stackoverflow.com/questions/825018
复制相似问题