【问题标题】:Why should a pimpl be declared as a struct and not a class?为什么要将 pimpl 声明为结构而不是类?
【发布时间】:2014-09-18 07:18:30
【问题描述】:

pimpl 成语的规范形式(来自 Herb Sutter 的“Exceptional C++”)如下:

class X 
{
public:
 /* ... public members ... */
protected:
 /* ... protected members? ... */ 
private:
 /* ... private members? ... */
 struct XImpl;
 XImpl* pimpl_; // opaque pointer to
                // forward-declared class 
};

我的问题是,为什么 XImpl 被声明为结构而不是类?

【问题讨论】:

  • 隐藏已经隐藏的东西是没有意义的。 privateclass 的默认访问与publicstruct 的默认访问似乎有点矫枉过正。
  • 它绝对没有任何区别(除非你的编译器非常错误)。
  • @WhozCraig 但这是一个前瞻性声明。在这种特殊情况下,它完全没有区别。它甚至不保存打字:-)
  • @juanchopanza 我完全同意。它是我评论的正常decl这个词的语言差异。你说得对,它真的没有任何功能上的区别。

标签: c++ pimpl-idiom


【解决方案1】:

structclass 之间的唯一区别是基和成员(分别为公共和私有)的默认访问控制。您甚至可以用一个声明相同的类型并用另一个定义它(但请注意,某些编译器可能会对此发出警告)。

只使用对你来说最自然的东西。 @WhozCraig 正确地指出,由于 XImpl 在实现 X 之外已经无法访问,因此默认设置其成员 private 似乎是多余的。尽管如此,正如我上面所说,这根本没有区别,因为只有用于定义的关键字才重要。

【讨论】:

  • 但它是一个前向声明,所以这里的区别并不重要(除非有些人可能会在声明中看到 class 和在定义中看到 struct 感到困惑。)
  • @StilesCrisis 真的吗?从何时起? ? C++11 §11(3) [class.access] : "使用关键字 class 定义的类的成员默认是私有的"
  • 类绝对默认为私有!
  • @juanchopanza 和一些编译器甚至会在您将 class 前向声明为 struct 后定义发出警告
  • @ArneMertz IIRR,VS 也会发出此警告。但我必须说这是我认为有害的少数警告之一,并在我的项目中禁用它。
【解决方案2】:

这并没有真正的区别,因为结构和类基本相同,但您可能希望XImpl 中的所有内容都是公开的,因为它只对实现X 的代码可见。使用struct 而不是class 只是让您不必在其定义的开头写public:

【讨论】:

    【解决方案3】:

    嗯...我不知道为什么 Herb Sutter 决定使用 struct,但如果您愿意,可以使用 class 代替,在这种情况下它是等效的。

    【讨论】:

      猜你喜欢
      • 2016-07-03
      • 2011-06-03
      • 1970-01-01
      • 2014-08-05
      • 2011-04-16
      • 1970-01-01
      • 2012-03-01
      • 2011-01-23
      相关资源
      最近更新 更多