2014-09-18 6 views
5

Die kanonische Form des Pimpl Idioms (von Herb Sutter "Exceptional C++") lautet wie folgt:Warum sollte ein pimpl als Struktur und nicht als Klasse deklariert werden?

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

Meine Frage ist, warum ist XImpl als Struktur deklariert statt einer Klasse?

+4

Es ist wenig sinnvoll, etwas zu verbergen, das bereits verborgen ist. Der Standardzugriff von 'private' für eine' class' gegenüber 'public' für eine' struct' scheint trivial zu sein. – WhozCraig

+3

Es macht absolut keinen Unterschied (außer Ihr Compiler ist sehr sehr fehlerhaft). –

+0

@WhozCraig Aber das ist eine Vorwärtsdeklaration. In diesem speziellen Fall macht das überhaupt keinen Unterschied. Es spart nicht einmal Tippen :-) – juanchopanza

Antwort

2

Nun ... ich weiß nicht, warum Herb Sutter hat sich entschieden, struct zu verwenden, aber Sie können stattdessen class verwenden, wenn Sie bevorzugen, ist es in diesem Fall gleichwertig.

6

Der einzige Unterschied zwischenstructclass und ist die Standard-Zugriffssteuerung der Basen und die Mitglieder (öffentlicher und privater, respectively). Sie können sogar den gleichen Typ mit einem deklarieren und ihn mit dem anderen definieren (beachten Sie jedoch, dass einige Compiler hier Warnungen ausgeben können).

Verwenden Sie einfach das, was Ihnen am natürlichsten ist. @WhozCraig weist richtig darauf hin, dass XImpl bereits außerhalb der Implementierung X unerreichbar ist, so dass seine Mitglieder private standardmäßig überflüssig erscheinen. Dennoch, wie ich oben gesagt habe, macht es keinen Unterschied, da nur das Schlüsselwort für die Definition von Bedeutung ist.

+1

Aber es ist eine Forward-Deklaration, so dass der Unterschied hier keine Rolle spielt (außer einige könnten verwirrt werden, wenn sie 'class' in einer Deklaration und' struct' in der Definition sehen.) – juanchopanza

+2

@StilesCrisis Wirklich? Seit wann? ? C++ 11 §11 (3) [class.access]: "Mitglieder einer Klasse, die mit dem Schlüsselwort' class' definiert wurde, sind standardmäßig privat. " – WhozCraig

+1

Klasse ist definitiv privat! –

2

Es macht nicht wirklich einen Unterschied, da Strukturen und Klassen im Grunde gleich sind, aber Sie wollen wahrscheinlich alles in XImpl öffentlich sein, weil es nur für den Code sichtbar ist, der X sowieso implementiert. Die Verwendung von struct anstelle von class erspart Ihnen lediglich das Schreiben von public: am Anfang seiner Definition.

Verwandte Themen