C++: 2 Klassen gegenseitig referenzieren

  • 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?

  • 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.

    Dipper dipper dii dipper dii dipper dii duuu

  • 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.

    God Save the Queen,8,1

  • 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.

    throw away your television

  • 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 :)

    God Save the Queen,8,1

  • 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

    C
    #include "A.h"
    #include "B.h"
    main()
    {
      B b1(new A(0));
      A a1(new B(0));
      A a2(0);
      A a3(new B(new A(new B(new A(new B(0))))));
    }

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!