在 pimpl idiom 中,所有私有成员和函数都被移动到(私有)实现类。如果一个类有一个私有构造函数应该怎么办?是否应该将其移至实施?如果是,如何?
class X {
private:
X(); // moving it to XImpl???
public:
void DoSomething();
private:
class XImpl;
std::unique_ptr<XImpl> pimpl;
};
在 pimpl idiom 中,所有私有成员和函数都被移动到(私有)实现类。如果一个类有一个私有构造函数应该怎么办?是否应该将其移至实施?如果是,如何?
class X {
private:
X(); // moving it to XImpl???
public:
void DoSomething();
private:
class XImpl;
std::unique_ptr<XImpl> pimpl;
};
由于各种原因,PIMPL 完全是为了消除不希望的公共标头依赖性。例如,使用单词的 C 头文件class
(正确性)、增加构建时间的大头文件(工作效率)、带有不良宏的头文件(代码脆性)。C++ 可访问性,private
与public
orprotected
无关,尽管如果可访问性与功能是否属于 PIMPL 类密切相关,这一点也不奇怪:通常这些功能将是实现细节。
当您理解 PIMPL 之类的技术并且该技术是解决手头问题的好方法时,请使用它。
不要盲目地应用基于食谱式机械规则的各种技术。当您清楚地看到呈现给您的这样一个规则集是不完整的,就像这里一样,那么正确的反应是关闭规则集,而不是要求它完成。它无法完成,它导致的关于如何处理private
构造函数的问题是没有意义的。