Problem mit Basisklassenzeiger



  • ich habe in einer lib folgende klassen

    class MACWidget		   
    {
    
    	public:
    		virtual int flCreate (RENDERCREATE* ptr_render) = 0;
    		virtual int flMain (RENDERCREATE* ptr_render) = 0;
    		virtual int addButton (int x, int y, int cx, int cy, int id, char* name) = 0;
    	private:
    	protected:
    
    };
    
    class MACMessageSystem
    {
    	public:
    		virtual int Event_WindowCreate (void) {return 0;}
    		virtual int Event_MouseMoved (void) { return 0; }
    		virtual int Event_Repaint (void) { return 0; }
    		virtual int Event_Resize (void) {return 0; }
    		virtual int Event_MouseClicked (int x, int y) {return 0; }
    		virtual int Event_MouseClickedSecundary (int x, int y) { return 0;}
    	private:
    	protected:
    
    };
    

    in einer dll die (vereinfacht hier abgebildete) klasse

    class MACWindow : public MACWidget, MACMessageSystem
    {
    	private:
    		HWND hWindow;             /*window handle*/
    		bool b_keys [256];        /*array of key flags*/
    	public:
    		MACWindow (void);
    		~MACWindow (void);
    
    		static LRESULT CALLBACK window_proxy (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
    		LRESULT CALLBACK WndProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
    		virtual int flMain (RENDERCREATE* ptr_render);
    		virtual int flCreate (RENDERCREATE* ptr_render);
    		virtual int addButton (int x, int y, int cx, int cy, int id, char* name);
    		HINSTANCE getApplicationInstance (void) { return (HINSTANCE) GetModuleHandle (NULL); }
    		HWND getMainApplicationWindow (void) { return (HWND) this->hWindow; }
    
    	protected:
    };
    

    und in der exe wird eine klasse definiert:

    class MyApplication : public MACMessageSystem
    {
    	public:
    		MyApplication (void);
    		void CreateWindowDevice (void);
    		void CreateDisplayDevice (void);
    		void CreateApplicationWindow (void);
    
    	private:
    		RENDERCREATE r;	
    		MACWidget* bla;	
    		MACRenderer* ptr_render;
    		MACRenderDevice* ptr_render_device;
    		MACGUIHandler* gui;	  
    		LOG* mainlog;	
    	protected:
    };
    

    In der Callback (MACWindow) rufe ich nun die einzelnen Eventfunktionen auf. Logisch: Es werden die Methoden aus MACWidget (Basisklasse) ausgeführt und nicht die überschriebenen der klasse in der exe (MyApplication). Allerdings will ich das so haben. Das Problem ist das die anderen Klassen von der Klasse MyApplikation nix wissen! Wie kann ich das Realisieren, dass trotzdem die Methoden von MyApplikation aufgerufen werden?



  • Wieso ist MACWindow von MACMessageSystem abgeleitet? Eigentlich würde das höchstens Sinn machen, wenn man weitere Klassen von MACWindow ableiten würde und dort die Ereignisse definieren würde(durch Überschreiben der Event-Funktionen). Aber das scheinst du ja nicht so vorgesehen zu haben. Wenn du innerhalb von MACWindow nur Ereignisse feststellen und die dann weiterreichen willst, dann kannst du das so machen, daß bei MACWindow MACMessageSysteme "registriert" werden und die Ereignisse dann an die registrieren Systeme deligiert werden



  • Wow. Du hast ein echt übles Design.



  • Wenn du innerhalb von MACWindow nur Ereignisse feststellen und die dann weiterreichen willst, dann kannst du das so machen, daß bei MACWindow MACMessageSysteme "registriert" werden und die Ereignisse dann an die registrieren Systeme deligiert werden

    Bitte das ganze mal für doofe , das ist ja vielleicht ein Brocken....



  • man könnte des ziemlich komplex machen, aber sehr einfach ungefähr so:

    class MACWindow ... //nicht mehr von MACMessageSysten erben
    {
      private:
        MACMessageSystem*msgSys_; //alle Ereignisse daran senden
      ...
      public:
        MACWindow(MACMessageSystem*msgSys); //einfach in msgSys_ kopieren
      ...
    
    };
    

    Wenn MyApplication jetzt von MACMessageSystem abgeleitet ist, dann kannst du den Konstruktor von MACWindow mit einem Objekt von MyApplication aufrufen (innerhalb von MyApplication wär das dann der this-Zeiger)



  • also um es mal zu abstrahieren.....

    du schlägst vor in MACWindow einen Member zu definieren, der einen zeiger auf MACMessageSystem definiert. Das habe ich doch richtig verstanden oder?!

    ...was der Zeiger im Konstruktor soll habe ich jetzt nicht so ganz verstanden (also vom sinn her).

    Hast du vielleicht nen beispiel???



  • du schlägst vor in MACWindow einen Member zu definieren, der einen zeiger auf MACMessageSystem definiert. Das habe ich doch richtig verstanden oder?!

    so ungefähr. Du mußt deine Events in WndProc (schätz ich mal) dann eben an das von diesem Zeiger referenzierte Objekt verschicken

    msgSys_->Event_Bla();
    //anstatt
    EventBla(); //bzw. this->EventBla();
    

    Wie willst du es denn in MyApplication haben? Soll es ein Hauptfenster geben, das für die Events dann die Funktionen von MyApplication nutzen soll?

    Dann kannst du in MyApplication halt einfach einen Member MACWindow mainWin_ reintun und dessen Konstruktor im Konstruktor von MyApplication dann mit Parameter this aufrufen.

    Versuchs doch einfach mal, is eigentlich total einfach diese Lösung. Eigentlich nur eine Vererbung aufgelöst.



  • hmmm versuch ich gerne wenn du lust hast kannst mich ja mal anschreiben (ICQ :157413201).

    Ich muss zugeben dass es mir noch nicht völlig klar ist.... werd grad nochmal drüber schauen....

    Gruß Para



  • hmmmm also noch ne Frage:

    Ich lasse meinen Zeiger in einer dll (com objekt) auf die klasse setzten habe dafür dolgende Funktion:

    extern "C" __declspec (dllexport) void MACExport (HINSTANCE hdll, MACWidget** ptr_base)
    {
    	*ptr_base = new MACWindow ();   
    }
    

    Muss ich jetzt um das zu Realisieren einen 3. Parameter als einen MACMessageSystem** hinzufügen und den zeiger als Parameter an MACWindow übergebenen oder?!

    Gruß Para



  • hallo?!



  • so ich habe das jetzt soweit angepasst, das meine dllfunktion die Sache mit dem Konstruktor nimmt:

    class MyApplication : public MACMessageSystem
    {
    	public:
    		MyApplication (void);
    		void CreateWindowDevice (void);
    		void CreateDisplayDevice (void);
    		void CreateApplicationWindow (void);
    
    	private:
    		RENDERCREATE r;	
    		MACWidget* bla;	
    		MACRenderer* ptr_render;
    		MACRenderDevice* ptr_render_device;
    		MACGUIHandler* gui;	  
    		LOG* mainlog;	
    	protected:
    };
    
    /* hier steht was - poste ich jetzt net*/
    
    void MyApplication::CreateWindowDevice (void)
    {
    	gui->CreateDevice ("windows", (MACMessageSystem*) this);
    	bla = gui->getDevice ();
    
    }
    

    Die CreateDevice Methode ruft dann die Exportmethode auf die ich ebend gepostet hatte und die Initialisiert das MACWindow Objekt (natürlich jetzt mit MACMessageSystem* als Parameter. Nur was habe ich jetzt davon?!?!

    Ich stecke nun wieder fest....



  • Implementiere/Überschreibe doch mal die Event-Funktionen von MACWindowSystem in MyApplication oder aus welchem Grund hast du das sonst davon abgeleitet?


Anmelden zum Antworten