Ich habe zwei Klassen, Foo<T>
und Bar<T>
, abgeleitet von Base
. Jede überschreibt eine Methode virtual Base* convert(ID) const
, wobei ID
eine Instanz eines Typs ist, der eine bestimmte Instanziierung von Foo
oder Bar
eindeutig identifiziert (so tun, als wäre es ein enum
). Das Problem ist, dass Foo::convert()
in der Lage sein muss, eine Bar
Instanz zurückzugeben, und ebenfalls Bar::convert()
muss Foo
instanziieren können. Da beide Vorlagen sind, führt dies zu einer zirkulären Abhängigkeit zwischen Foo.h
und Bar.h
. Wie kann ich das beheben?Auflösen einer zirkulären Abhängigkeit zwischen Template-Klassen
Edit: Eine Vorwärtsdeklaration nicht funktioniert, weil die Umsetzung der einzelnen Methoden den Konstruktor der anderen Klasse benötigt:
Foo.h
:
#include <Base.h>
template<class T> class Bar;
template<class T>
class Foo : public Base { ... };
template<class T>
Base* Foo<T>::convert(ID id) const {
if (id == BAR_INT)
return new Bar<int>(value); // Error.
...
}
Bar.h
:
#include <Base.h>
template<class T> class Foo;
template<class T>
class Bar : public Base { ... };
template<class T>
Base* Bar<T>::convert(ID id) const {
if (id == FOO_FLOAT)
return new Foo<float>(value); // Error.
...
}
Der Fehler ist natürlich "ungültige Verwendung von unvollständigem Typ".
Zyklische Abhängigkeiten sind selten eine gute Idee. Versuchen Sie, es neu zu gestalten, so dass die Abhängigkeit gebrochen ist. Eine erste Idee wäre, die 'convert'-Methode in eine freie Funktion umzuwandeln, die sowohl von' Bar' als auch 'Foo' abhängt ... –