2009-07-23 4 views
0

Ich bin auf der Suche nach einem schönen Buch, Referenzmaterial, das sich mit der Vorwärtsdeklaration von Klassen befasst, besonders. Wenn sich Quellen in mehreren Verzeichnissen befinden, z. Klasse A in dirA ist Vorwärts in Klasse B in dirB deklariert? Wie wird das gemacht?Vorwärtsdeklaration in mehreren Quellverzeichnissen; Template Instanziierung

Auch jedes Material für Vorlagenprobleme, fortgeschrittene Anwendungen und Instanziierungsprobleme, sehr gut geeignet?

Danke.

Antwort

4

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.

+0

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. –

+0

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. –

1

wenn sie parallel Verzeichnisse sind, können Sie es

#include "../dirB/B.h" 

gehören mögen, aber in Header rufen Sie einfach diese Zeile für vorwärts decleration

class B; 

statt dessen können Sie trennen Ihre Include-Verzeichnisse und Quellverzeichnisse.

so ist, dann können Sie Verzeichnis wie dieses Verzeichnis anzeigen schließen und Sie können Header hinzufügen, indem

#include "dirB/B.h" 

Aufruf, da Sie eine vorwärts decleration auf Header machen, es wird nicht Problem sein.

+1

Nicht verwenden .. in umfasst. –

+0

Also, wenn meine Klasse B in dirB ist und ich Forward-Deklaration und nicht enthalten bin, ist es die Aufgabe des Compilers zu schauen, wo es definiert ist? Gibt es eine Chance/Möglichkeit für zwei Klassen denselben Namen zu haben, wenn das Projekt sehr groß ist? Was wird in diesem Fall passieren? –

+0

Die Forward-Deklaration bedeutet "es gibt diesen Typ, aber ich habe ihn noch nicht definiert". Es versucht nicht, nachzuschlagen. Wenn Sie zwei identische Typen im selben Bereich haben, erhalten Sie einen Kompilierungsfehler. – CiscoIPPhone

1

Im Allgemeinen können Sie deklarieren in Kopfzeilen weiterleiten, um vollständige Includes zu vermeiden oder um das Zirkelreferenzing (schlecht) zu aktivieren. Sie können einen nach vorne deklarierten Typ nur nach Zeiger oder Verweis oder Rückgabetyp verwenden.

Groß angelegte C++ Software Design von John Lakos (book review here) Adressen physikalische Design (Dateien) und logisches Design und wie sie beziehen sich auf Software-Komponenten (die nicht immer 1: 1 mit Klassen).

Verwandte Themen