2014-09-18 10 views
5

Kanoniczna forma idiomu pimpl (z Herb Sutter za „wyjątkowe C++”) przedstawia się następująco:Dlaczego pimpl powinien być zadeklarowany jako struktura, a nie klasa?

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

Moje pytanie brzmi, dlaczego XImpl zadeklarowane jako struct zamiast klasy?

+4

Nie ma sensu ukrywanie czegoś, co jest już ukryte. Domyślny dostęp do 'private' dla' class' vs. 'public' dla' struct' wydaje się trywialnym przesadą. – WhozCraig

+3

Nie ma absolutnie żadnej różnicy (chyba że twój kompilator jest bardzo błędny). –

+0

@WhozCraig Ale to jest deklaracja terminowa. W tym konkretnym przypadku nie ma absolutnie żadnej różnicy. Nie zapisuje nawet pisania :-) – juanchopanza

Odpowiedz

2

Cóż ... Nie wiem, dlaczego Herb Sutter zdecydował się użyć struct, ale możesz użyć class zamiast tego, jeśli wolisz, jest to odpowiednik w tym przypadku.

6

tylko różnica między struct i class jest domyślnym kontroli dostępu od podstaw i członków (publicznych i prywatnych, odpowiednio). Możesz nawet zadeklarować ten sam typ z jednym i zdefiniować go z drugim (pamiętaj jednak, że niektóre kompilatory mogą wysyłać ostrzeżenia na ten temat).

Po prostu użyj tego, co jest dla ciebie najbardziej naturalne. @WhozCraig poprawnie wskazuje, że ponieważ XImpl jest już niedostępna poza implementacją X, domyślne ustawienie jej członków na private wydaje się zbędne. Mimo to, jak już wspomniałem powyżej, nie ma w tym żadnej różnicy, ponieważ liczy się tylko słowo kluczowe użyte w definicji .

+1

Ale jest to deklaracja do przodu, więc różnica nie ma tutaj znaczenia (z wyjątkiem niektórych może się mylić widząc 'klasa' w deklaracji i' struct' w definicji.) – juanchopanza

+2

@StilesCrisis naprawdę? Od kiedy? ? C++ 11 §11 (3) [class.access]: "Członkowie klasy zdefiniowanej słowem kluczowym" klasa "są domyślnie prywatni" – WhozCraig

+1

Klasa zdecydowanie domyślnie jest prywatna! –

2

To naprawdę nie robi różnicy, ponieważ struktury i klasy są zasadniczo takie same, ale prawdopodobnie chcesz, aby wszystko w XImpl było publiczne, ponieważ jest widoczne tylko dla kodu, który implementuje X. Użycie struct zamiast class powoduje, że zapisujesz tylko na początku definicji public:.

Powiązane problemy