Declare aber nicht definieren innere Struktur / Klasse - legal C ++ oder nicht?

8

Folgt der folgende Code C ++ oder nicht?

%Vor%

Sowohl Visual C ++ als auch GCC akzeptieren es, aber der Code scheint mir etwas seltsam zu sein und ich würde es hassen, ihn von irgendeinem zukünftigen Compiler ablehnen zu lassen.

Dennoch scheint mir das Muster nützlich zu sein, um Abhängigkeiten bei der Kompilierung zu reduzieren - ich benutze es oft, um Strukturen zu deklarieren, die dazu dienen, einen "Kontext" (eine Reihe von Variablen) zu übergeben, die von einigen Funktionen gemeinsam genutzt werden die gleiche CPP-Datei, und auf diese Weise muss ich nicht die "Kontext" -Definition in die öffentliche Schnittstelle einführen.

    
Suma 14.10.2009, 07:42
quelle

2 Antworten

10

legal und in der Tat nützlich, um Implementierungsdetails nach außen zu verbergen.

    
stijn 14.10.2009, 07:51
quelle
9

[Bearbeiten] Ich sagte ursprünglich, dies sei das "Pimpl-Idiom": Ссылка aber ich stimme zu, dass dies nur ein Teil von Pimpl ist. Diese Technik wird von pimpl verwendet.

Sie leiten die Klassenleiste innerhalb der Klasse Foo weiter. Tadellos legal, solange du nichts innerhalb des Definino von Foo machst, das die Größe von Bar erfordern würde. Sie können auf einen Balken mit einem Zeiger oder einer Referenz verweisen (Balken * oder Balken & Amp;), aber wenn Sie in Foo ein Datenelement wie das folgende deklarieren:

privat:     Bar _bar;

Es würde nicht funktionieren. Der Grund dafür ist, dass die Definition von Foo ausreichen muss, um die Größe von Foo zu bestimmen. Da die Größe von Bar innerhalb der Definition von Foo unbekannt ist, würde die Größe von Foo unbestimmt werden. Aber mit einem Zeiger würde funktionieren:

privat:     Bar * _bar;

Weil die Größe des Zeigers gleich und somit bekannt ist, unabhängig davon, wie der Balken später definiert wird.

    
zumalifeguard 14.10.2009 08:00
quelle