Klassen mit Kreisreferenz



  • hi

    Habe ein Problem. Brauche in zwei Klassen jeweils eine Referenz auf die andere. Doch das gibt Probleme bei der Konstruktion.

    class A
    {
    public:
        A( B& b) : m_b( b ) {}
    private:
        B& m_b;
    };
    
    class B
    {
    public:
        B( A& a) : m_a( a ) {}
    private:
        A& m_a;
    };
    

    😕

    Wie kann ich die Zwickmühle lösen?
    Danke im vorraus



  • Auf die Weise gar nicht (das Ziel der Referenz muß existieren, bevor du darauf verweisen kannst, also hast du ein Problem, in welcher Reihenfolge A und B angelegt werden können). Aber du könntest Pointer (die sind nicht so restriktiv wie Referenzen) und Forward-Deklarationen verwenden.

    (PS: Wozu soll das gut sein? Und warum verschmilzt du nicht beide Klassen zu einer Einheit?)



  • Also Klasse A ist das Spiel selbst, Klasse B der Spieler.
    Die beiden rufen sich gegenseitig Methoden ab.
    Der Spieler kann auch ausgetauscht werden.



  • G. Kreisler schrieb:

    Der Spieler kann auch ausgetauscht werden.

    Dann hast Du auch schon die Referenz die keine sein darf. Denn bei Referenzen kann das referenzierte Objekt nicht ausgetauscht werden.



  • G. Kreisler schrieb:

    Der Spieler kann auch ausgetauscht werden.

    Ein klarer Punkt gegen Referenzen (die kannst du nämlich NICHT austauschen) - damit bleiben zumindest hierfür nur noch Zeiger:

    class player;//forward Deklaration
    
    class game
    {
      player* m_player;
    public:
      game()
      : m_player(NULL) {}
      void set_player(player* the_player)
      { m_player=the_player; }
    };
    
    class player
    {
      game& m_game;
    public:
      player(game& the_game)
      : m_game(the_game) {}
    };
    
    ...
    game G;
    player P(G);
    G.set_player(&P);
    ...
    


  • void set_player(player &the_player)
      { m_player = &the_player; }
    

    Find ich so schöner. 😉



  • Ok, danke euch.
    Mag zwar keine Zeiger, aber passt so wohl.


Anmelden zum Antworten