Ich habe derzeit zwei Klassen: foo und bar. Foo verwendet Instanzen von bar in einer seiner Methoden, und bar verwendet eine Instanz von foo in seinem Konstruktor. Dies wird jedoch nicht kompiliert. Ich verstehe, dass es eine zirkuläre Abhängigkeit gibt, also habe ich versucht, aus diesem herauszubrechen, indem ich den Balken innerhalb von foo nach vorne deklariere, bevor die foo-Methode in der Header-Datei deklariert wird. Das ist fehlgeschlagen, weil ich in der Quelldatei in der Methode von foo überhaupt keine Leiste oder irgendwelche Komponenten verwenden kann. Ich habe dann versucht, es neu zu arrangieren, so dass alles in der Quelldatei, die die Leiste benötigte, bereits definiert war, dann habe ich alle Definitionen für die Leiste eingegeben, dann habe ich die Methode in foo definiert, die die Leiste verwendet. Das ist aus dem gleichen Grund fehlgeschlagen. Hier ist eine vereinfachte Version von meinem Code so weit:Vermeiden von zirkulären Abhängigkeiten in Klassen-Definitionen in C++
// Header.h
class foo{
class bar;
void method(bar& b);
};
class bar{
bar(foo& f, double d);
};
// Source.cpp
#include Header.h
// stuff defining foo that I need for bar in the form foo::foo(...){...}
// stuff defining bar that I need for foo::method
void foo::method(bar& b){
// do stuff with foo and b
}
Ich möchte darauf hinweisen, dass, wenn ich Verweise entfernen, um die Instanz von bar in der Definition von foo :: Methode, wird der Code kompiliert und ordnungsgemäß ausgeführt wird.
Mein spezifisches Beispiel hat die foo-Klasse als Vektor in homogenen Koordinaten und die Balkenklasse als Quaternion. Die Quaternion-Klasse verwendet einen Vektor und einen Drehwinkel in ihrem Konstruktor, und die Vektorklasse verwendet das Quaternion in seiner Rotationsmethode.
Gibt es eine Möglichkeit, dies zu programmieren, ohne die Abhängigkeiten zu entfernen, oder sollte ich nur eine der Abhängigkeiten entfernen?
Ihr Code sollte gut funktionieren, wenn Sie "bar" vor 'foo' deklarieren (nicht innerhalb) – vu1p3n0x