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
被声明为结构而不是类?
答案 0 :(得分:7)
struct
和class
之间的仅差异是基础和成员(分别为公共和私有)的默认访问控制。你甚至可以用一个声明相同的类型并用另一个定义它(但请注意,一些编译器可以对此发出警告)。
只要使用最自然的东西。 @WhozCraig正确地指出,由于XImpl
在实现X
之外已经无法访问,因此默认情况下使其成员private
似乎是多余的。尽管如此,正如我上面所说的,它在这里没有任何区别,因为它只是用于定义的关键词。
答案 1 :(得分:2)
嗯......我不知道为什么Herb Sutter决定使用struct
,但如果您愿意,可以使用class
,在这种情况下它是等效的。
答案 2 :(得分:2)
它并没有真正有所作为,因为结构和类基本相同,但您可能希望XImpl
中的所有内容都是公开的,因为它只对实现{的代码可见{1}}无论如何。使用X
代替struct
只会使您无需在定义开头编写class
。