SIGNAL & SLOT Marke Eigenbau



  • Wie kann ich ihm das denn sagen?

    Ich steh grad irgendwie aufm Schlauch 😞



  • Trenne Memberdeklaration von Memberdefinition. Sprich: Teil die Klasse auf in Header und Implementierungsdatei.



  • Danke jetzt funktionierts.. 🙂

    Aber auch nur wenn ich foo() als static deklariere..
    Geht das noch anders? Ich hätte gerne, dass in das aktuelle Objekt von Main engegriffen wird..



  • Du solltest wissen, was du tust, und nicht einfach ausprobieren. static setzt man nicht hin, "damit es funktioniert", sondern weil man damit eine bestimmte Semantik erreichen möchte.

    Michael E. hat ja schon gesagt, was du tun sollst. Die Trennung von Header und Implementierungsdatei sollte auch in jedem Anfängerbuch erläutert sein. Ausserdem wirst du im Internet massenhaft Erklärungen dazu finden.



  • Mir ist sehr wohl bekannt was man mit einem static bezweckt.. Aber ohne geht es nicht, auch nicht durch die Trennung in Header und
    Implementierungsdatei:

    1>c:\dokumente und einstellungen\...\signal.cpp(12) : error C2352: 'Main::foo': Unzulässiger Aufruf einer nicht statischen Memberfunktion
    


  • NEO.PIXEL schrieb:

    Mir ist sehr wohl bekannt was man mit einem static bezweckt..

    Dann wüsstest du aber, dass man zum Aufruf einer nicht-statischen Memberfunktion ein Objekt benötigt. Das hast du bei Main::foo() nicht.



  • Das weiß ich wohl, aber dazu müsste ich x global anlegen und das hatte ich so eigentlich nicht geplant..
    Oder komme ich noch irgendwie anders an das Objekt ran??

    Ich bin verwirrt 😞



  • Das Objekt kannst du ja an BASE im Konstruktor übergeben und dann speichern (evtl. als Zeiger/Referenz).

    Übrigens: Zu Signal-Slot-Systemen könntest du dir auch boost::function und boost::signals anschauen...



  • So könnte is gehen 🙂

    Dann probier ich mal und lass von mir höre wenns läuft..

    Danke für die Hilfe 🙂



  • So.. Wie angedroht wollte ich mich ja melden wenns läuft: 😃

    // signal.hpp
    #pragma once
    
    #include <iostream>
    
    class Main;
    
    class BASE
    {
        typedef Main& SLOTCLASS
    	SLOTCLASS sltc;
    public:
    	BASE(SLOTCLASS sc)	:	sltc(sc)	{}
    	void operator()(int i);
    };
    
    typedef BASE	SLOT;
    typedef BASE&	SIGNAL;
    
    class Make
    {
    public:
    	Make(SIGNAL SI)	:	signal(SI)	{}
    	SIGNAL signal;
    };
    
    class Main
    {
    	int x;
    public:
    	Main(void)	:	slot(*this), x(7)	{}
    	SLOT slot;
    	void foo(int i)
    	{
    		x += i;
    		std::cout<<"SIGNAL WORKS "<<x<<std::endl;
    	}
    };
    
    // signal.cpp
    
    void BASE::operator ()(int i)
    {
    	main.foo(i);
    }
    
    // main.cpp
    #include "signal.hpp"
    
    int main()
    {
    	Main x;
    
    	Make y(x.slot);
    
    	y.signal(35);
    
    	system("pause");
    }
    

    Fänd es jetzt aber noch schön für BASE ein Template zu haben, um Zeile 10 allgemeiner gestallten zu können.. Ist das irgendwie möglich?


Anmelden zum Antworten