首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Pimpl惯用法与纯虚拟类接口

Pimpl惯用法与纯虚拟类接口
EN

Stack Overflow用户
提问于 2009-05-05 14:05:14
回答 10查看 25.6K关注 0票数 123

我想知道是什么让程序员选择Pimpl惯用法或纯虚拟类和继承。

我知道pimpl惯用法为每个公共方法和对象创建开销提供了一个显式的额外间接地址。

另一方面,Pure虚拟类为继承实现提供了隐式的间接性(Vtable),我知道没有创建对象的开销。

编辑:但是如果您从外部创建对象,则需要一个工厂

是什么让纯虚拟类不如pimpl习惯用法那么可取呢?

EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2009-05-05 15:15:04

在编写C++类时,应该考虑它是否将是

  1. A值类型

按值复制,身份从来都不重要。它适合作为std::map中的一个键。例如,"string“类,或"date”类,或"complex number“类。“复制”这样一个类的实例是有意义的。

  1. An实体类型

身份很重要。总是通过引用传递,从不通过"value“传递。通常,“复制”类的实例是没有意义的。当它确实有意义时,多态的“克隆”方法通常更合适。示例:套接字类、数据库类、“策略”类,以及函数式语言中的任何“闭包”。

pImpl和纯抽象基类都是减少编译时依赖性的技术。

然而,我只使用pImpl来实现值类型(类型1),而且只有在我真正想要最小化耦合和编译时依赖时才使用它。通常,这是不值得的。正如您正确地指出的那样,有更多的语法开销,因为您必须为所有的公共方法编写转发方法。对于类型2类,我总是使用带有关联工厂方法的纯抽象基类。

票数 60
EN

Stack Overflow用户

发布于 2009-05-05 14:09:01

Pointer to implementation通常是关于隐藏结构化实现细节的。Interfaces是关于实例化不同的实现。它们实际上有两个不同的目的。

票数 30
EN

Stack Overflow用户

发布于 2009-05-05 14:12:39

pimpl惯用法可以帮助您减少构建依赖和构建时间,特别是在大型应用程序中,并最大限度地减少类的实现细节在一个编译单元中的头部暴露。您的类的用户甚至不需要知道粉刺的存在(除非是他们不了解的隐秘指针!)。

抽象类(纯虚拟)是你的客户必须知道的东西:如果你试图使用它们来减少耦合和循环引用,你需要添加一些方法来允许它们创建你的对象(例如,通过工厂方法或类,依赖注入或其他机制)。

票数 28
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/825018

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档