Probleme mit Include Kreuz-Referencen im Strategie Pattern



  • Hallo,

    ich beschäftige mich seit einiger Zeit mit der Implementation eines Strategie Patterns. Allerdings treten dort nun Include-Referenzprobleme auf. Vielleicht kann mir einer von euch weiterhelfen, denn ich weis langsam nicht mehr weiter. Hier einmal eine Grobskizze vom Aufbau des Patterns, wie ich es realisiere:

    Interface I     (Header C)
                             Var: Abstract Class C* Member;
    
                             Fkt:  Fkt. A
                                   virtual Fkt. B
                           /               \
                   Header(I, D)       Header(I, F)
                   Class A : I        Class B : I
                      Fkt. CA          Fkt. HB
                      Fkt. FA          Fkt. JB
                      Fkt. BA          Fkt. BB
    
                            Abstract Class C
                            Var: Interface I*  Member;
    
                            Fkt: virtual   Fkt. A1                           
                                 virtual   Fkt. A2
    
                            /              \
                   Concrete Class D :C   Concrete Class F :C
                      Fkt. A1              Fkt. A1
                      Fkt. A2              Fkt. A2
    

    Wie man (hoffentlich) der Grafik entnehmen kann, habe ich ein Interface I, von dem eine der 2 Klassen (A,B) instanziiert wird, je nachdem welche was benötigt wird. Jede der Instanzen ist von I abgeleitet, do das beide die Funktionen aus dem Interface, so wie eigene Funktionen nutzen können. Ferner wird im Programmfluss immer gegen das Interface (Basisklasse) gearbeitet.

    Für das StrategiePattern besitzt die Basisklasse eine Referenz auf die abstrakte Klasse C. Von dieser gibt es je nach Bedarf die konkrete Umsetzung D oder F. Diese Klassen arbeiten gegen das Interface über einen Pointer um Funktionen aus dem Interface direkt aufrufen zu können. Diesen Pointer erhalten die konkreten Klassen bei der Instanziierung in A oder B als Konstruktorparameter.

    Soweit so gut, bisher gab es auch keine Probleme. Jetzt benötigt jedoch die konkrete Umsetzung D einen Zugriff auf die Funktionen von A und hier treten die Probleme auf. Denn A besitzt bereits einen Header auf D um die konkrete Instanz für die abstrakte Klasse im Interface zuweisen zu können. Hierfür müsste ich eigentlich "nur" die Interface Referenz auf A oder B casten, je nach bedarf. Um dies zu realisieren benötige ich den Header von A bzw. B in C oder D...

    Include ich in D den Header von A, dann gibt es sobald ich versuche eine Membervariable von A anzulegen Auflösungsprobleme durch "Kreuzreferenzen", trotz include-Wächter.

    Mir ist klar, dass diese "Kreuzreferenzen" nicht zulässig sind. Normalerweise könnte ich einfach in D eine Forward Deklaration durch den class A; Aufruf einbinden, wenn ich nur eine Deklaration benötige, ich brauche jedoch eine Definition um explizit aus einer der Funktionen A1 oder A2 auf eine Funktion von A zuzugreifen (FA, BA oder CA).

    Dies ist so nicht möglich...

    Bin dankbar für jeden Tipp,
    Gruss
    Chrisitan

    P.S.: Dabei sollte möglichst das Pattern nicht verändert werden da es so genau
    den spezifizierten Anforderungen enstpricht. Zudem besteht alles schon
    aus mehreren 100ten LOCs



  • In den Header immer nur ne Forward-Deklaration machen und dann in die CPP den anderen Header einbinden.

    So klappt das eigentlich immer.

    Hab jetzt aber nicht dein Beitrag durchgelesen.



  • Bitte erst lesen, dann antworten ... Forward Deklarationen nutzen hier nichts, da ich aufgrund der Abhängigkeiten auf beiden Seiten Instanzreferenzen benötige !



  • IMHO wär das in Code-Form etwas übersichtlicher ...


Anmelden zum Antworten