Belibiges Object übergeben



  • Hallo,

    wie kann ich einer Methode als Parameter pointer eines Beliebigen Objects und auf beliebige Methode der Klasse übergeben?

    ich habe sowas versucht, doch es geht nicht:

    template <class T>
    class Test
    {
    ....
            void registerEvent(FEVENT events, T * cmp, void (typename T::*method)())
            {
    ....
    

    wie kann ich das implementieren? Ich möchte einfach Pointer auf dieverse Objekte und Methoden Speichern um diese dann später aufzurufen. Das Problem ist ja Jetzt, dass die Objecte von verschiedenen Klassen stammen.

    thx



  • Zuerst mal: "geht nicht" ist keine ausreichende Fehlermeldung.

    Ansonsten schau dich mal nach Dingen wie boost::bind um, damit könnte man vermutlich was in der Richtung machen.



  • Nimm eine andere Programmiersprache, in der es first class functions gibt. Natuerlich kann man closures etc. durchaus in Objekten kapseln, nennt sich dann auch Funktor. Das was du da aber eigentlich vorhast, halte ich fuer Bockmist.



  • Dann kommen solche Fehlermeldungen:

    ./../../FaSTK/FComponent.hpp:48: error: expected `)' before "typename"
    ./../../FaSTK/FComponent.hpp:48: error: expected `,' or `...' before "typename"
    ./../../FaSTK/FComponent.hpp:48: error: `registerEvent' declared as function ret
    urning a function
    ./../../FaSTK/FComponent.hpp:48: error: `<anonymous>' has incomplete type
    ./../../FaSTK/FComponent.hpp:48: error: invalid use of `void'
    ./../../FaSTK/FComponent.hpp:48: error: expected `;' before ')' token
    


  • kows schrieb:

    Dann kommen solche Fehlermeldungen:

    Dann muss wohl das typename weg 😉 Wenn die Syntax nicht stimmt, dan "gehts nicht".



  • Dann kann ich in der .cpp Datei keine Globale Variable erstellen, weil ein Error kommt:

    FComponent.cpp:41: error: expected constructor, destructor, or type conversion b
    efore '*' token
    
    #include "FaSTK/FComponent.hpp"
    FComponent* __FaSTKComponentThis;
    


  • Dann hast du vielleicht einen Fehler in der Headerdatei? (Klassendefinition nicht mit Semikolon abgeschlossen?)

    Wie gesagt, das sind Syntaxfehler und eigentlich keine Designprobleme die du da hast.



  • kows schrieb:

    FComponent* __FaSTKComponentThis;
    

    Es gibt unendlich viele gültige Bezeichner in C++. Was ist das für eine mysteriöse Macht, die anscheinend so viele dazu zwingt, ausgerechnet die wenigen reservierten zu verwenden?



  • es liegt weder an dem mysteriösen Bezeichner, noch an der Syntax, denn wenn ich templating wegnehme, und überall stat T FComponent oder so schreibe, dann lässt es sich Compilieren. Das Problem trat erst auf, als ich es für jede Klasse portieren wollte.

    aber es will ja so nicht gehen ...

    MfG



  • Die .cpp wird garnicht veränder, die hpp sieht so aus:

    #ifndef FCOMPONENT_HPP
    #define FCOMPONENT_HPP
    
    #include "FaSTK/FDefs.hpp"
    #include "FaSTK/FString.hpp"
    
    class FComponent
    {
        public:
            FComponent(bool system);
            ~FComponent();
    
            void _init(FString title, int x, int y, int width, int height,
                        FSTYLE style, FSTYLE exstyle, FComponent* parent, bool show);
            void show();
            void hide();
            void registerEvent(FEVENT events, FComponent * cmp, void (FComponent::*method)())
            {
                register short ind = 0;
                for(register short i=1; i<=32; i++)
                {
                    if((1<<i) & events)
                    {
                        this->eventToMethod[ind] = method;
                        this->eventToComponent[ind] = cmp;
                    }
                }
                this->registeredEvents |= events;
            };
    
        /**** system depend part ****/
        #include FSYSPATH(FComponent.hpp)
    };
    
    #endif
    

    und mit Templates so:

    #ifndef FCOMPONENT_HPP
    #define FCOMPONENT_HPP
    
    #include "FaSTK/FDefs.hpp"
    #include "FaSTK/FString.hpp"
    
    template <class T>
    class FComponent
    {
        public:
            FComponent(bool system);
            ~FComponent();
    
            void _init(FString title, int x, int y, int width, int height,
                        FSTYLE style, FSTYLE exstyle, FComponent* parent, bool show);
            void show();
            void hide();
            void registerEvent(FEVENT events, T * cmp, void (T::*method)())
            {
                register short ind = 0;
                for(register short i=1; i<=32; i++)
                {
                    if((1<<i) & events)
                    {
                        this->eventToMethod[ind] = method;
                        this->eventToComponent[ind] = cmp;
                    }
                }
                this->registeredEvents |= events;
            };
    
        /**** system depend part ****/
        #include FSYSPATH(FComponent.hpp)
    };
    
    #endif
    

  • Mod

    Das ist sicherlich nicht exakt der Code, der die gezeigten Fehlermeldungen erzeugt, da schon die Zeilennummern nicht übereinstimmen. In Anbetracht der Art und Weise, wie Compiler typischerweise versuchen, Fehler zu reparieren, würde ich darauf tippen, dass im ersten Fall das Semikolon nach der Deklaration von hide versehentlich entfernt wurde.
    Im zweiten Fall ist es sowieso klar: da FComponent ein Template und eben keine Klasse ist, gibt es auch keine Zeiger darauf. Es fehlt die Templateargumentliste.



  • Wenn es ein Eventsystem werden soll, mach es doch wie alle anderen ... Erstelle eine abstrakte Klasse Eventhandler mit einer virtuellen Methode execute, die das Event verarbeitet. Davon erben jetzt alle Handler und implementieren execute. Beim Start des Programms wird der Eventhandler am Device (or what ever) registriert. Ganz ohne Templates ...


Log in to reply