Können sich in C++ 2 Klassen gegenseitig referenzieren? Ist es möglich dass jede der 2 Klassen einen Zeiger auf die andere hat?
Ich denke eigentlich nicht, weil das ja eine Art von Henne-Ei Problem ist, oder?
C++: 2 Klassen gegenseitig referenzieren
-
-
Kein Problem.
Seien die beiden Klassen A und B, ihre Headerdateien a.h und b.h.
In a.h deklarierst du die andere Klasse mit "class B;". Dann kannst du einen "B* b;" in der Klasse A verwenden.
Umgekehrt gehts genauso: In b.h ein "class A;" und in Klasse B ein "A* a;".
Das funktioniert, weil der Compiler gar nicht wissen will, wie A und B konkret aussehen. Es reicht ihm, dass er ja immer weiß, wie groß ein Zeiger ist.
-
was aber durchaus net geht, is, wenn du für beide klassen den pointer auf die andere klasse im constructor setzen willst (also mit übergabe) und es gibt keine andere möglichkeit ein objekt zu instanzieren und wenn der pointerwert ungleich null ist, weil dann is es wirklich henne-ei, aber das kann man ja mithilfe von nachträglichem setzen bzw. mit hilfe des null lassens umgehen
lg Shine
-
Zitat von Shine
was aber durchaus net geht, is, wenn du für beide klassen den pointer auf die andere klasse im constructor setzen willst (also mit übergabe) und es gibt keine andere möglichkeit ein objekt zu instanzieren und wenn der pointerwert ungleich null ist, weil dann is es wirklich henne-ei, aber das kann man ja mithilfe von nachträglichem setzen bzw. mit hilfe des null lassens umgehen
lg Shine
file: A.h
class B; // forward
class A
{
public:
A(B*b);
private:
B* b;
}file: a.cpp
#include "A.h"
#include "B.h"A:A(B*b){this->b=b;}
file: B.h
class A; // forward
class B
{
public:
B(A*a);
private:
A* a;
}file: b.cpp
#include "A.h"
#include "B.h"B:B(a*a){this->a=a;}
in den cpp files ist es dann auch kein problem ganz normal mit der jeweils anderen Klasse zu arbeiten, nur im header muß man aufpassen, daß keine zyklischen Abhängigkeiten auftauchen, z.b. eben durch forwards und pointer. Diese Sache macht man sich z.B. auch im PIMPL idiom zu Nutze.
-
paralax: Shine hatte schon recht, dein Code laesst sich zwar vielleicht kompilieren, aber nicht verwenden: Versuch mal, ein Objekt der Klasse A anzulegen. Dazu wuerdest du zuerst ein Objekt der Klasse B benoetigen, und umgekehrt genauso.
-
Zitat von buechsengustel
paralax: Shine hatte schon recht, dein Code laesst sich zwar vielleicht kompilieren, aber nicht verwenden: Versuch mal, ein Objekt der Klasse A anzulegen. Dazu wuerdest du zuerst ein Objekt der Klasse B benoetigen, und umgekehrt genauso.
ja da hast du recht in meinem fall müßt man einmal nen nullptr setzen und könnt das nie wieder umstellen, da müßt man halt ne setmethode einführen und das im nachhinein zurechtbiegen, dann ginge das ohne probleme
-
Zitat von paralax
ja da hast du recht in meinem fall müßt man einmal nen nullptr setzen und könnt das nie wieder umstellen, da müßt man halt ne setmethode einführen und das im nachhinein zurechtbiegen, dann ginge das ohne probleme
Richtig, ala
-
#include "A.h"
#include "B.h"
main()
{
A a(NULL);
B b(&a);
a.SetB(&b);
}
Jetzt mitmachen!
Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!