为什么要将pimpl声明为结构而不是类?

时间:2014-09-18 07:18:30

标签: c++ pimpl-idiom

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被声明为结构而不是类?

3 个答案:

答案 0 :(得分:7)

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

只要使用最自然的东西。 @WhozCraig正确地指出,由于XImpl在实现X之外已经无法访问,因此默认情况下使其成员private似乎是多余的。尽管如此,正如我上面所说的,它在这里没有任何区别,因为它只是用于定义的关键词。

答案 1 :(得分:2)

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

答案 2 :(得分:2)

它并没有真正有所作为,因为结构和类基本相同,但您可能希望XImpl中的所有内容都是公开的,因为它只对实现{的代码可见{1}}无论如何。使用X代替struct只会使您无需在定义开头编写class