Vorwärtsdeklarationen haben nichts mit der Verzeichnisstruktur Ihres Projekts zu tun. Sie können etwas weiterleiten, das in Ihrem Projekt nicht vorhanden ist. Sie werden hauptsächlich verwendet, um zyklische Referenzen zwischen Klassen aufzulösen und die Kompilierung zu beschleunigen, wenn die vollständige Klassendeklaration nicht notwendig ist, und das entsprechende # include kann durch eine forward-Deklaration ersetzt werden.
Um zu bestimmen, wann eine Forward-Deklaration ausreicht, kann die sizeof() -Abfrage normalerweise die Frage beantworten. Zum Beispiel
class Wheel;
class Car
{
Wheel wheels[4];
};
In dieser Erklärung kann eine Vorwärts-Deklaration nicht verwendet werden, da der Compiler die Größe eines Autos nicht bestimmen kann: es nicht weiß, wie viele Daten die Räder enthalten. Mit anderen Worten, sizeof(Car)
ist unbekannt.
Auch in Bezug auf Vorlagen können vorwärts deklarierte Klassen nicht als Vorlagenparameter verwendet werden, wenn die Vorlagenklasse Datenelemente des Vorlagenparameters enthält (deren Zeiger jedoch sein können). Zum Beispiel
template<class T> class pointer
{
T *ptr;
};
class Test;
pointer<Test> testpointer;
legal ist aber
std::vector<Test> testvector
wird nicht kompiliert.
Aufgrund der oben genannten Einschränkungen werden in Vorwärtsrichtung deklarierte Klassen im Allgemeinen als Zeiger oder Referenzen verwendet.
Ich weiß nicht, ob es ein Buch zu diesem Thema gibt, aber Sie können this section auf C++ FAQ Lite sehen.
Ich war gerade dabei, dies zu sagen, bis ich las: "Vorwärts deklarierte Klassen können nicht als Template-Parameter verwendet werden". Das ist nicht wahr, kannst du ein Beispiel dafür geben, was du meinst? Wir können dann diesen Satz so formulieren, wie Sie es wirklich meinen. Auch vorwärts deklarierte Klassen können sowohl Verweise als auch Zeiger sein. –
Richard, danke für die Antwort, ich war in Eile und habe offensichtlich einige Punkte verpasst. Was ich über Template-Parameter gesagt habe, ist falsch und ich habe Referenzen vergessen. –