Vorwärtsdeklaration mit Vektor des Klassentyps - Zeiger auf unvollständige Klassenart nicht erlaubt

7

Ich habe zwei Klassen, foo und bar. foo enthält einen Balken und enthält einen std :: Vektor von Zeigern zu Balkenobjekten. Irgendwann während der Laufzeit muss der Balken auf diesen Vektor von Zeigern zu anderen Balkenobjekten zugreifen. Daher enthält foo eine Methode namens getBarObjects (), die das Array von Zeigern zurückgibt.

Dafür erkläre ich foo in bar. Ich muss natürlich auch die Methode, die ich verwende, weiterleiten - foo :: getBarObjects (). Da dies das Array von Zeigern auf bar zurückbringt, gerät ich in einen Teufelskreis.

Ich kann include Bar nicht weiterleiten und dann einfach include getBarObjects () weiterleiten, da dies dazu führt, dass "unvollständiger Typname nicht erlaubt ist".

foo.h:

%Vor%

bar.h:

%Vor%

bar.cpp:

%Vor%

Wenn ich einfach andersherum einschließe, habe ich später dasselbe Problem. Irgendwelche Vorschläge?

    
Aerius 10.10.2011, 14:35
quelle

3 Antworten

15

Sie können keine Deklarationselemente weiterleiten.

Stattdessen sollte bar.cpp sollte #include sowohl foo.h als auch bar.h sein. Problem gelöst.

Im Allgemeinen, wenn Sie die Sequenz verwenden:

  • Forward deklariert alle Klassentypen
  • Definieren Sie alle Klassentypen
  • Körper von Klassenmitgliedern

alles wird gut.

    
Ben Voigt 10.10.2011, 14:37
quelle
4

Sie müssen foo.h oder bar.h nicht einschließen, es sei denn, Sie greifen auf die Interna einer der beiden Klassen aus der anderen Header-Datei zu. Deklarieren Sie die Klassen nach Bedarf in den Headerdateien, und schließen Sie dann beide Headerdateien aus Ihrer Quelldatei ein.

foo.h

%Vor%

bar.h

%Vor%

bar.cpp

%Vor%     
CurtisB 10.10.2011 14:51
quelle
1

Sie haben vergessen, den Vektor in foo.h weiterzuleiten. Sie geben auch den vector by-Wert von getBarObjects zurück, was möglicherweise nicht das ist, was Sie wollen, und die Vorwärtsdeklaration der Member-Funktion ist nutzlos.

Außerdem: Verwenden Sie Kopfschutze. Ziehen Sie den entsprechenden intelligenten Zeiger für Ihre Situation ( std::shared_ptr , unique_ptr ) gegenüber unformatierten Zeigern vor. Achten Sie auf const ness.

    
pmr 10.10.2011 14:37
quelle

Tags und Links