2012-08-15 7 views
5

Ich weiß, dass ähnliche Fragen dazu zuvor gestellt worden sind, aber nach meiner Forschung habe ich noch Fragen zu Rundschreiben Header umfasst.C++ - Rundkopf enthält

Nun, wenn ich zwei zirkuläre Abhängigkeiten habe, ist dies die Art, wie ich Leute auf Stackoverflow gesehen habe, um das Problem zu umgehen. Mein einziges Problem dabei ist, dass in meinem main.cpp ich fooa.h zuerst und dann „meine Frage ist foob.h

enthalten muss
//main.cpp the right way 
#include "fooa.h" 
#include "foob.h" 

//main.cpp that will surely get a compile error 
#include "foob.h" 
#include "fooa.h" 

Jetzt gibt es eine Möglichkeit, diese Klassen in einer Weise erklären weiterleiten das wird Erlaube es mir nicht, die Reihenfolge zu beachten, in der ich die Header-Dateien in meine main.cpp einfüge? "

+0

Wie die Antworten haben darauf hingewiesen, können Sie eine Forward-Deklaration in beiden Dateien verwenden können. Wenn die Situation komplizierter wäre, könnten Sie "fooa.h" 'von' foob.h' hinzufügen, was die gewünschte Einschlussreihenfolge garantiert. –

+0

In den Includes im Beispielcode ist nichts Zirkuläres enthalten. Wenn du die fehlenden # endifs hinzufügst, ist alles in Ordnung. Welchen Kompilierungsfehler bekommst du? –

Antwort

7

Gibt es eine Möglichkeit, diese Klassen weiterzuleiten, so dass ich die Reihenfolge, in der ich die Headerdateien in meine main.cpp einfüge, nicht beachten kann?

da man mit einfachen Zeiger handelt nur, können Sie eine Forward-Deklaration verwenden hier in beiden Fällen:

FooA.h

#ifndef H_FOOA 
#define H_FOOA 

// #include "foob.h" << not needed! 
class FooB;  // << substitute with a forward declaration of FooB 

class FooA{ 
    public: 
     FooB *fooB; 
}; 
#endif 

FooB.h

#ifndef H_FOOB 
#define H_FOOB 

class FooA; 
class FooB{ 
    public: 
     FooA *fooA; 
}; 
#endif 
+0

@ user1600812 genau, und Main kann die Dateien enthalten, die es benötigt - mit diesem Beispiel spielt die Reihenfolge keine Rolle. – justin

+0

Ich glaube, ich habe vergessen, das in meinem spezifischen Code zu erwähnen. fooa.h forward deklariert sich selbst, weil es in meinem Code ein paar sich selbst verweisende Zeiger gibt. In meinem speziellen Fall glaube ich nicht, dass Sie es auf Ihre Art tun könnten, weil ich zweimal eine Klasse erklären würde. In dem obigen Beispiel funktioniert Ihre Lösung jedoch.Vielen Dank. – user1600812

+0

@ user1600812 C++ erlaubt mehrere Weiterleitungsdeklarationen (z. B. in separaten Dateien). – justin

2

Sie müssen sich nicht um die Bestellung kümmern, da fooa.hfoob.h enthält und foob.h die Forward-Deklaration für FooA hat. Alles ist bereits in deinem Code korrekt.

+1

Modulo die fehlenden # endif's, es gibt überhaupt kein Problem mit dem Code wie gepostet. Es gibt auch keine Zirkularität, was mich vermuten lässt, dass etwas fehlt. –

1

Da beide Klassen einfach einen Zeiger enthalten, müssen Sie den anderen Header nicht einschließen. Eine Vorwärtsdeklaration wird ausreichen.

Jeder Code, der tatsächlich die andere Klasse verwendet wird benötigen die Kopfzeile, aber das sollte in einer cpp-Datei sein.

1

Verwenden Sie eine Forward-Deklaration in beiden Header-Dateien.

Wussten Sie, dass Sie es in derselben Zeile deklarieren können?

In "FooB.h"

class FooB{ 
    public: 
     class FooA *fooA; 
}; 

In "FooA.h"

class FooA { 
    public: 
     class FooB *fooB; 
}; 
+0

werden nicht Vorwärtsreferenzen auf FooB :: FooA bzw. FooA :: FooB gemacht? –