1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team-Mitglieder
    4. Trophäen
    5. Mitgliedersuche
  4. Tutorial Bereich
  • Deutsch
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

C++: 2 Klassen gegenseitig referenzieren

  • Sicka
  • 15. Mai 2006 um 16:24
  • Unerledigt
  • Sicka
    5
    Sicka
    Mitglied
    Punkte
    240
    Beiträge
    34
    • 15. Mai 2006 um 16:24
    • #1

    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?

  • sauzachn
    17
    sauzachn
    Mitglied
    Reaktionen
    51
    Punkte
    3.101
    Beiträge
    606
    • 15. Mai 2006 um 17:08
    • #2

    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

  • Shine
    7
    Shine
    Mitglied
    Punkte
    465
    Beiträge
    89
    • 15. Mai 2006 um 18:52
    • #3

    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 :winking_face:

    lg Shine

  • paralax
    2
    paralax
    Mitglied
    Punkte
    20
    Beiträge
    4
    • 23. Mai 2006 um 22:20
    • #4
    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 :winking_face:

    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

  • buechsengustel
    8
    buechsengustel
    Mitglied
    Reaktionen
    1
    Punkte
    626
    Beiträge
    109
    • 31. Mai 2006 um 14:54
    • #5

    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

  • paralax
    2
    paralax
    Mitglied
    Punkte
    20
    Beiträge
    4
    • 31. Mai 2006 um 14:59
    • #6
    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

  • djmaecki
    8
    djmaecki
    Mitglied
    Reaktionen
    1
    Punkte
    616
    Beiträge
    119
    • 31. Mai 2006 um 15:07
    • #7
    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))))));
    }
  • paralax
    2
    paralax
    Mitglied
    Punkte
    20
    Beiträge
    4
    • 31. Mai 2006 um 15:13
    • #8

    #include "A.h"
    #include "B.h"
    main()
    {
    A a(NULL);
    B b(&a);
    a.SetB(&b);
    }

    God Save the Queen,8,1

  • Maximilian Rupp 27. Dezember 2024 um 12:06

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

Jetzt mitmachen!

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

Benutzerkonto erstellen Anmelden

Benutzer online in diesem Thema

  • 1 Besucher

Rechtliches

Impressum

Datenschutzerklärung

  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Lexikon
  • Erweiterte Suche
  • Deutsch
  • English
Zitat speichern