Ich habe ein Problem mit der Deklaration von Forward in C ++ mit dem Compiler clang. Hier ist mein Code. Es verweist Daten in CReference-Mitglied als unvollständigen Typ. Bitte Hilfe
%Vor% Vorwärtsdeklaration ist nützlich, wenn der Compiler nicht die vollständige Definition des Typs benötigt. Mit anderen Worten, wenn Sie Ihre Internal data;
zu Internal* data
oder Internal& data
ändern, wird es funktionieren.
Mit Internal data;
muss der Compiler die gesamte Definition von Intrenal
kennen, um die Struktur von CReference
class erstellen zu können.
Um einen Typ als Mitglied einer Klasse zu verwenden, muss der Compiler wissen, wie groß er ist, damit die Größe der Klasse korrekt berechnet werden kann. Eine Forward-Deklaration stellt diese Information nicht zur Verfügung (C ++ wird nicht nach vorne schauen und versuchen, sie zu finden, insbesondere da der Body in einer anderen Übersetzungseinheit deklariert sein könnte), so dass Sie ihn nicht als Wertelement verwenden können.
Sie können stattdessen einen Zeiger oder eine Referenz verwenden, da Zeiger und Referenzen die gleiche Größe haben, unabhängig davon, auf welchen Typ sie sich beziehen. Dann muss der Compiler nur die Größe dieses Typs kennen, sobald Sie anfangen, ihn zu manipulieren, und Sie können bis dahin ohne die vollständige Deklaration davonkommen.
Wie oben erwähnt. Die Vorwärtsdeklaration dient dazu, die Header-Hölle in Header-Dateien zu vermeiden, wenn nur ein einfacher Zeiger einer Klasse in der Kopfzeile verwendet wird.
Normalerweise möchten Sie die Includes in den Header-Dateien so klein wie möglich halten. Dies kann erreicht werden, indem eine Klasse nach vorne deklariert wird, aber nur dann, wenn es sich nicht um eine geschachtelte Klasse handelt, und wenn der Zeiger im Header verwendet wird, da die Zeigergröße die erforderliche Information ist, die von der Vorwärtsdecl bereitgestellt wird. p>
Tags und Links c++