【问题标题】:Pimpl idiom in C++ and private constructorC ++中的Pimpl习语和私有构造函数
【发布时间】:2015-02-18 06:52:23
【问题描述】:

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

class X {
private:
    X();  // moving it to XImpl???
public:
    void DoSomething();
private:
    class XImpl;
    std::unique_ptr<XImpl> pimpl;
};

【问题讨论】:

  • 一个私有构造函数被用来拒绝类的构造,而不是通过某种工厂方法。如果你把它移到实现中,你的接口类将得到一个默认的构造函数——这就是你想要的吗?
  • @DevSolar:感谢您的评论/问题。另一个类是class X 的朋友,应该创建一个X 类型的对象。我想我必须拥有这个私人 ctor,但我想知道它的缺点是什么!

标签: c++ pimpl-idiom private-constructor


【解决方案1】:

出于各种原因,PIMPL 完全是为了消除不需要的公共标头依赖性。例如,使用单词class 的 C 头文件(正确性)、增加构建时间的大头文件(工作效率)、带有不良宏的头文件(代码脆弱)。 C++ 可访问性,privatepublicprotected,与它无关,尽管如果可访问性与功能是否属于 PIMPL 类密切相关,这一点也不奇怪:通常这些功能将是实现细节。

当您理解 PIMPL 之类的技术并且该技术是解决手头问题的好方法时,请使用它。

不要盲目地应用基于食谱式机械规则的各种技术。当您清楚地看到呈现给您的这样一个规则集是不完整的,就像这里一样,那么正确的反应是关闭规则集,而不是要求它完成。它无法完成,它导致如何处理private 构造函数的问题毫无意义。

【讨论】:

  • +1 仅用于最后一段。 C++ 是一头奇怪的野兽,如果你用左边的“设计模式”和右边的“面向初学者的 OOP”之类的东西来处理它,你将永远无法正确驾驭它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多