Design-Problem?



  • Hallo,

    ich habe mich gerade festgefahren. Ich habe 2 Klassen welche sich jedoch auf irgendeine Weise gegenseitig "brauchen".

    Ich brauche ein Atribut der anderen Klasse inkludiere ich diese jetzt wird sie in der inkludierten Datei wieder inkludiert usw... Ich weiß nicht mehr weiter. Ich hab leider keine Idee wie ich das Problem lösen kann.

    Konkret brauch die andere Klasse einen std::vector um weiterarbeiten zu können.

    Die Klassen hängen also gewissermaßen voneinander ab. Was kann ich tun? Ich hoffe mein Problem ist verständlich.



  • Das ist durchaus "lösbar", aber willst du das wirklich? Eine solche Kreisbeziehung ist richtig fies zu warten. Zeig doch mal den Code.



  • Hallo

    Das geht nur über Pointer und Forward Declarations

    //Header A
    #ifndef A_H
    #define A_H
    #include <B.h>
    
    class B;
    
    class A
    {
      ...
      B* b;
      void UseB();
    }
    #endif
    
    // Imp A
    #include "A.h"
    #include "B.h"
    ...
    void A::UseB()
    {
      b->UseA();
    }
    
    //Header B
    #ifndef B_H
    #define B_H
    #include <A.h>
    
    class A;
    
    class B
    {
      ...
      A* a;
      void UseA();
    }
    #endif
    
    // Imp B
    #include "B.h"
    #include "A.h"
    ...
    void B::UseA()
    {
      a->UseB();
    }
    

    bis bald
    akari



  • //#include "System.h"
    class MessageThread : public Thread /* Ist eine selbstgeschriebene Klasse für Threads, da ich glaube CreateThread ist böse habe ich das alles mit _beginthread usw... gelöst... */
    {
    	private:
    		MessageVec				Messages;
    
    	public:
    		MessageThread( void );
    		~MessageThread( void );
    
    /*
     Alle 3 Funktionen brauchen Foobar aus der Klasse System
    */
    		virtual void Run( void );
    		void HandleNextMessage( void );
    		void QueueMessage( void );
    };
    //########################################
    #include "MessageThread.h"
    class System
    {
    	private:
    		FooVec				Foobar;  // <-- Da muss ich dran
    		MessageThread			MyMessageThread; // Wird aber auch benötigt!
    
            // ...
    };
    

    Wie stelle ich das nun am besten dar? Ich würds gerne so elegant wie möglich lösen...

    Die Klasse System verwaltet jedenfalls alles. Ich würde den Thread gerne auslagern und hab dazu die Klasse MessageThread angelegt die in System benötigt wird. Damit diese richtig arbeiten kann brauch sie eben den Vector aus der Klasse System...

    System -> MessageThread
    MessageThread <- System

    👎

    Erinner mich daran das ich irgendwann schonmal so ein Problem hatte. Gibts da keine vernünftigen Möglichkeiten? Ich möchte nicht jedesmal vor dem gleichen Problem stehen 😞



  • Drei Medium-gute Vorschläge fallen mir ein:

    - Ich weiß nicht, wie die Klasse System beschaffen ist, aber evtl kannst du sie als Singleton implementieren? Natürlich nur, wenn sie dafür geeignet ist... Wäre dann wenigstens ein bisschen eleganter, aus MessageThread dann mit "System::GetInstance()->LoadFooBar()" oder ähnlichem drauf zuzugreifen 😕

    - Die Klasse MessageThread bekommt von Anfang an einen Pointer oder eine Referenz auf die Klasse System. Der wird dann im Konstruktor übergeben. Soweit ich weiß, löst dann der Compiler eine Warnung aus, dass man this-Zeiger nicht übergeben darf (im Konstruktor von System musst du dann ja den Konstruktor von MessageThread mit this als Parameter aufrufen), aber soweit ich weiß, ist das aber ungefährlich und beeinträchtigt in keiner Weise irgendwas; du darfst dann im Konstruktor von MessageThread nur nix mit dem System-Zeiger machen, außer ihn halt in einer Member-Variable zu speichern.

    - Du könntest evtl (kommt auf das Gesamt-Design an) "Foobar" aus der System-Klasse auslagern und ihr eine eigene Klasse spendieren. Dann würden einfach MessageThread und System auf die Foobar zugreifen können, ohne dass MessageThread die Klasse System kennen muss. Aber wenn du das so machst, dann keine Sachen, wie System von Foobar aus als friend deklarieren und als quasi-member behandeln :p


Anmelden zum Antworten