作者热门文章
- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
关于 pimpl idiom 有一些关于 SO 的问题,但我更好奇它在实践中的使用频率。
我了解在性能和封装之间需要权衡取舍,另外由于额外的重定向会导致一些调试烦恼。
这样,这是应该在每个类(class)还是全有或全无的基础上采用的东西?这是最佳实践还是个人偏好?
我意识到这有点主观,所以让我列出我的首要任务:
我总是假设我需要在某个时候将我的代码公开为一个库,所以这也是一个考虑因素。
编辑:欢迎提出任何其他选项来完成同样的事情。
最佳答案
我想说的是,您是按类(class)还是全有或全无的基础上进行这取决于您首先选择 pimpl 成语的原因。在建立图书馆时,我的原因是以下之一:
这些原因都不会提示采用全有或全无的方法。在第一种情况下,您只需要隐藏您想要隐藏的内容,而在第二种情况下,对于您希望更改的类来说这样做可能就足够了。同样出于第三和第四个原因,只有隐藏重要的成员才能受益,而这些成员又需要额外的 header (例如,第三方库,甚至 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;
}
在这种情况下,权衡开始打击你,因为需要取消引用指针,并且不能内联方法。但是,如果您只为非平凡的类执行此操作,那么通常可以容忍轻微的开销而不会出现任何问题。
关于c++ - 实践中的 Pimpl 成语,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/843389/
我通常不会这样做,但我目前正在从事的项目需要几个位于 c 源文件中的函数。 extern "C" { int words(char sentence[]); int match(cha
我是一名优秀的程序员,十分优秀!