Eine Frage zu Funktionszeigern



  • sambalmueslie schrieb:

    no matching function for call to ‘TSpecificFunctor<EventHandler>::TSpecificFunctor(EventHandler* const, void (EventHandler::)(MSTEvent))’

    TSpecificFunctor(const TClass* _pt2Object, void (*_fpt)(MSTEvent*))
    

    Der Konstruktor erwartet als zweites Argument einen Zeiger auf eine freie Funktion, die einen pointer auf MSTEvent als Parameter hat und keinen Rueckgabewert. Du hingegen uebergibst ihr einen Pointer auf eine Memberfunktion, was zwei verschiedene Paar Schuhe (zwei unterschiedliche Typen) sind.



  • pumuckl schrieb:

    Der Konstruktor erwartet als zweites Argument einen Zeiger auf eine freie Funktion, die einen pointer auf MSTEvent als Parameter hat und keinen Rueckgabewert. Du hingegen uebergibst ihr einen Pointer auf eine Memberfunktion, was zwei verschiedene Paar Schuhe (zwei unterschiedliche Typen) sind.

    Ah oki, thx. Ich habs hab da was beim Copy-Paste und ausprobieren verschluckt.
    So funktioniert es jetzt :

    TSpecificFunctor(TClass* _pt2Object, void (TClass::*_fpt)(MSTEvent*))
    

    Danke
    Gruß Oli



  • gleich nochwas, bevor du es dir angewoehnst: Namen mit fuehrendem Unterstrich sind zum Teil fuer den Compiler reserviert. Gibt da meines Wissens ne liste, aber am Besten umgeht man Probleme damit, indem man Namen mit fuehrendem unterstrich einfach vermeidet. Ich persoenlich mach in solchen Faellen den unterstrich hinten ran 🙂



  • pumuckl schrieb:

    gleich nochwas, bevor du es dir angewoehnst: Namen mit fuehrendem Unterstrich sind zum Teil fuer den Compiler reserviert. Gibt da meines Wissens ne liste, aber am Besten umgeht man Probleme damit, indem man Namen mit fuehrendem unterstrich einfach vermeidet. Ich persoenlich mach in solchen Faellen den unterstrich hinten ran 🙂

    Hm danke für den Tipp, die unterstriche waren schon vorgegeben, ich nenn die Variablen immer gleich und verwendet den this-Zeiger um zu unterscheiden.
    Gruß Oli



  • Mal nen Beispiel zu Funktionszeigern, das dir das nen bissel erklären sollte:

    template<typename object, typename result, typename param1>
    struct mem_fn_call
    {
        typedef result (object::*fnPtr)(param1 const&);
    
        mem_fn_call(object const& inst, fnPtr func) : inst(inst), func(func) {}
        result operator()(param1 const& param) { return (inst.*func)(param); }
    private:
        object const& inst;
        fnPtr func;
    };
    
    class foo
    {
    public:
        void bar(std::size_t i) { std::cout << i << std::endl; }
    };
    
    int main()
    {
        foo inst;
        mem_fn_call<foo, void, std::size_t>(inst, &inst::bar)(10);
    }
    

    🙂



  • Thx,
    ja so langsam lichtet sich der Nebel etwas 🙂

    Was muss ich eigentlich tun, wenn ich die Adresse auf die der Funktionszeiger zeigt ausgeben möchte(muss) ???

    Hab mal folgendes versucht:

    void (FileHandler::*fpt)(MSTEvent*);
    fpt = &FileHandler::callbackOpenFilestream;
    std::cout << "FileHandler::initHandler::fpt:" << std::hex << (fpt) << std::endl;
    

    Dann bekomme ich aber als ausgabe nur eine "1".

    Bei

    std::cout << "FileHandler::initHandler::fpt:" << std::hex << (&fpt) << std::endl;
    

    bekomme ich:

    FileHandler::initHandler::fpt:0xbfd5afbc

    aber das dürfte ja die Adresse des Zeigers sein und nicht der Funktion.

    Hintergrund ist, dass ich "irgendwo" ein "Segmentation Fault" bekomme. Jetzt wollte ich mal überprüfen, dass die Funktion auf die gezeigt wird auch die richtige ist und sich das nirgends ändert.
    Habs auch mal bisschen mit dem "gdb" versucht, bin aber da auch noch nicht sonderlich weit gekommen.

    Gruß Oli



  • Debug einfach mal ... also so wie ich es da aufgeschrieben hab ist es korrekt(sollte) ... ehm evtl. einfach mal durch Steppen ...



  • Was muss ich eigentlich tun, wenn ich die Adresse auf die der Funktionszeiger zeigt ausgeben möchte(muss) ???

    Wie ich schon geschrieben habe, besteht ein Methodenzeiger nur aus einem Offset (d.h. die 1 kann schon stimmen).
    Die wirkliche Adresse wird dann erst beim Aufruf ermittelt (und an diese kommst du nicht dran, besonders bei virtuellen Funktionen und Mehrfachvererbung wird es ziemlich komliziert -)

    Nachtrag:
    Wenn du ein konkretes Objekt hast, dann kannst du natürlich die Adresse bestimmen:

    &(obj.fpt)
    &(obj->*fpt)
    


  • (D)Evil schrieb:

    Debug einfach mal ... also so wie ich es da aufgeschrieben hab ist es korrekt(sollte) ... ehm evtl. einfach mal durch Steppen ...

    Debuggen tu ich fleißig 🙂 ..
    meinte das nicht auf deinen Teil bezogen.
    Gruß Oli



  • Th schrieb:

    Nachtrag:
    Wenn du ein konkretes Objekt hast, dann kannst du natürlich die Adresse bestimmen:

    &(obj.fpt)
    &(obj->*fpt)
    

    Jo genau sowas hab ich gesucht. Bin irgendwie aber nicht draufgekommen. 🙂 ..
    Gruß Oli


Anmelden zum Antworten