Vorwärts Deklaration der Klasse in C ++, unvollständiger Typ

7

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%     
tejusadiga2004 31.05.2013, 12:35
quelle

4 Antworten

15

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.

    
Kiril Kirov 31.05.2013 12:36
quelle
3

Die Vorwärtsdeklaration ermöglicht nur die Verwendung von Zeigern und Verweisen darauf, bis die vollständige Deklaration verfügbar ist

    
Andrew 31.05.2013 12:36
quelle
1

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.

    
Matthew Walton 31.05.2013 12:39
quelle
0

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>     

Samuel 31.05.2013 12:41
quelle

Tags und Links