C++ 中的 Pimpl 习语和私有构造函数

Pimpl idiom in C++ and private constructor

在 pimpl idiom 中,所有私有成员和函数都移至(私有)实现 class。如果 class 有一个私有构造函数应该怎么办?是否应该移至实施?如果是,如何?

class X {
private:
    X();  // moving it to XImpl???
public:
    void DoSomething();
private:
    class XImpl;
    std::unique_ptr<XImpl> pimpl;
};
由于各种原因,

PIMPL 就是要删除不需要的 public header 依赖项。例如,C headers 使用单词 class(正确性),大 headers 增加了构建时间(工作效率),headers 使用不好的宏(代码脆性)。 C++ 可访问性,privatepublicprotected,与它无关,尽管如果可访问性与功能是否属于 PIMPL [=22] 密切相关,这一点也不不自然=] 或不:通常这些功能将是实现细节。

当您了解 PIMPL 之类的技术并且该技术可以很好地解决手头的问题时,请使用它。

不要盲目应用基于cookbook-like机械规则的各种技术。当你清楚地看到你看到的这样一个规则集是不完整的,就像这里一样,那么正确的反应是放弃规则集,而不是要求它完成。它无法完成,它导致的private构造函数的问题是没有意义的。