Event an Ober Objekt schicken?



  • Hi,
    Ich versuche schon den ganzen tag Verzweifelt ein Event zwischen zwei Objekten zu realisieren:
    ich habe ein PackageHandler Objekt, welches ein Server-Objekt erstellt.
    Im späteren Verlauf soll der Server Event Nachrichten an den PackageHandler schicken.
    Allerdings weiss ich nicht wie ich das ganze realisieren soll?
    Ich habe in c++ leider nicht nicht viel erfahrung.. Bisher kann ich nur Delphi und Java.

    mein bisheriger code:

    Server.h:
    class Server
    {
    public:
    	Server(void (*iChange)(int &));
    	~Server(void);
    	void (* iChange)(int &);
    };
    Server.cpp:
    Server::Server(void (*iChangeHandler)(int &))
    {
    	mCounter = 0;
    	this->iChange = iChangeHandler;
    	int a = 5;
    	iChange(a);
    }
    Server::~Server(void)
    {
    }
    
    PackageHandler.h:
    
    class PackageHandler
    {
    public:
    	PackageHandler(void);
    	~PackageHandler(void);
    	void HandlePacket(int &blub);
    };
    
    PackageHandler.cpp:
    
    void PackageHandler::HandlePacket(int &blub)
    {
    	cout << "Event: " << blub << endl;
    }
    
    void HandlePacketB(int &blub)
    {
    	cout << "Event: " << blub << endl;
    }
    
    PackageHandler::PackageHandler(void)
    {
    	//mServer = new Server(HandlePacketB); //funktioniert super
        mServer = new Server(&PackageHandler::HandlePacket);// das leider nicht aber das würde ich gerne haben!
    }
    

    Fehlermeldung:

    Error	1	error C2664: 'Server::Server(void (__cdecl *)(int &))' : cannot convert parameter 1 from 'void (__thiscall PackageHandler::* )(int &)' to 'void (__cdecl *)(int &)'
    

    was mache ich falsch?

    mfg
    gandime



  • Das Problem liegt im impliziten this das jeder Methode mit übergeben wird.

    Mir sind zwei Lösungswege bekannt:

    1. Methode static machen
    2. boost::bind


  • blub² schrieb:

    Das Problem liegt im impliziten this das jeder Methode mit übergeben wird.

    Mir sind zwei Lösungswege bekannt:

    1. Methode static machen
    2. boost::bind

    Naja. Wenn man es selbst in der Hand hat, kann man durchaus auch mal überlegen, ob man da nicht gleich auch einfach den Zeiger auf das Objekt mitgibt. boost::bind ist natürlich die allgemeinere Variante, aber wenn man den Overhead nicht haben möchte, dann kann man das auch selbst machen.

    @TO:
    Schau mal hier, wie Memberfunktionszeiger funktionieren:
    http://www.newty.de/fpt/index.html

    Dann kannst du da einfach noch einen Zeiger auf die Objektinstanz übergeben. Dann geht das auch.



  • Danke für die Hilfe!
    Nun funktioniert das gute Event!



  • Wie hast du es den nun gemacht? (Lösungen bei Möglichkeit immer auch mitposten, denn es gibt nichts ärgerliches, wenn man einmal etwas sucht, genau einen Beitrag findet, der das gleiche Problem hatte, dann aber nur "es geht" postet und man ist selbst so schlau, wie vorher. 😉 - In dem Fall mit den Links gehts natürlich, aber es gibt nicht immer so offensichtliche Lösungen)


Anmelden zum Antworten