SO 上有一些关于粉刺成语,但我更好奇它在实践中被利用的频率是多少。
我知道性能和封装之间存在一些权衡,再加上额外的重定向带来的一些调试烦恼。
那么,这是应该在每个班级中采用,还是全有或全无的基础上采用?这是最佳实践还是个人偏好?
我意识到这有点主观,所以让我列出我的首要任务:
我总是假设我需要在某个时候将我的代码公开为库,所以这也是一个考虑因素。
EDIT:任何其他完成同样事情的选择都是受欢迎的建议。
我想说的是,你是否在每堂课上这样做,还是在全有或全无的基础上进行,取决于你首先为什么选择 pimpl 习惯用法。我在建立图书馆时的原因是以下之一:
- 想要隐藏实施以避免泄露信息(是的,这不是一个 FOSS 项目:)
- 想要隐藏实现以使客户端代码更少依赖。如果您构建共享库 (DLL),则可以更改 pimpl 类,甚至无需重新编译应用程序。
- 希望减少使用该库编译类所需的时间。
- 想要修复命名空间冲突(或类似的)。
这些原因都不会促使我们采取“全有或全无”的方法。在第一种情况下,您只需简化要隐藏的内容,而在第二种情况下,对于您希望更改的类来说,这样做可能就足够了。另外,出于第三个和第四个原因,隐藏重要的成员只会带来好处,而这些成员又需要额外的标头(例如,第三方库,甚至 STL 的标头)。
无论如何,我的观点是,我通常不会发现这样的东西太有用:
class Point {
public:
Point(double x, double y);
Point(const Point& src);
~Point();
Point& operator= (const Point& rhs);
void setX(double x);
void setY(double y);
double getX() const;
double getY() const;
private:
class PointImpl;
PointImpl* pimpl;
}
在这种情况下,您需要权衡,因为需要取消引用指针,并且无法内联方法。但是,如果您仅对重要的类执行此操作,那么通常可以容忍轻微的开销,不会出现任何问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)