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?
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:
alles wird gut.
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% 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.
Tags und Links c++