komisches typedef



  • okay ich hab mal im Internet etwas rumgestöbert. Zwar nicht allzuviel dazu gefunden, aber ich bin mit dem Verständnis wenigstens etwas weiter. Allerdings ist mir der Sinn des typedef noch nicht so ganz geläufig. Demnach hätte ja der Methodenzeiger die selbe Funktionalität wie void, bzw ist nur ein alias für void. Also müsste das Codestück doch genau das gleiche machen, wie wenn ich den Methodenzeiger durch void ersetze, aber geht das überhaupt?

    Hat jemand vielleicht noch bessere Literatur zu dem Thema? Es wurde zb. ziemlich oft function-pointer.org verlinkt aber da hab ich nichts über Methodenzeiger gefunden.



  • typedefs auf funktionspointer unterschieden sich etwas von solchen auf datentypen.

    typedef int xy;
    

    hier ist int der alte datentyp, xy der neue name dafür. bei funktions- oder methodenpointern ist der neue namen innerhalb des alten datentyps.

    typedef void (Class::*Method)();
    

    "Method" ist der neue name: "void (Class::*)()" ist der alte datentyp: es ist eine funktion mit rückgabetyp void und ohne parameter.



  • namenlos schrieb:

    typedefs auf funktionspointer unterschieden sich etwas von solchen auf datentypen.

    Nein, nicht im geringsten.

    Dein Beispiel ist grob irreführend, weil int ein primitiver Datentyp ist, ein Methodenzeiger ein komplexer. Gegenbeispiel:

    typedef void (Class::*type)[10];
    

  • Mod

    Bashar schrieb:

    Gegenbeispiel:

    typedef void (Class::*type)[10];
    

    Das geht nicht 😉 So aber z.B.:

    typedef int (Class::*type)[10];
    

    Für alle, die das nicht lesen können: das deklariert einen Typen type, der einen Zeiger auf ein Member der Klasse Class vom Typ Array aus 10 ints darstellt.



  • camper schrieb:

    Das geht nicht 😉

    Oops, ich wollte erst was mit void-Pointern machen und hab dann den Faden verloren 🙂



  • template<typename obj>
    class MenuEntryMethod : public MenuEntry
    {
        obj const& m_obj;  
        function m_fnptr;
    
    public:
        typedef void (obj::*function)();
        void operator()() { (m_obj.*m_fnptr)(); } 
    
        MenuEntryMethod(obj const& inst, function func, std::string const& name)
            : m_obj(inst), m_fnptr(func), MenuEntry(name)
        {}
    };
    

    würde ich es am ehesten logisch strukturieren. Aber zu Funktionszeigern guck einfach mal: www.function-pointer.org 🙂



  • @Bashar
    könntest du ein beispiel schreiben, wie du den type dann verwendest?



  • struct Class {
      int x[10], y[10];
    };
    Class a;
    
    typedef int (Class::*type)[10];
    
    type z = &Class::x;
    int i = (a.*z)[0];
    


  • ohje...und ich dachte schon, ich wäre halbwegs fit was cpp angeht :-0

    Aber das hier stimmt doch noch oder?

    namenlos schrieb:

    typedef void (Class::*Method)();
    

    "Method" ist der neue name: "void (Class::*)()" ist der alte datentyp: es ist eine funktion mit rückgabetyp void und ohne parameter.



  • Method ist dann eine Memberfunktion von Class mit Rückgabewert void und erwartet keine Parameter. Korrekt.



  • (D)Evil schrieb:

    Method ist dann eine Memberfunktion von Class mit Rückgabewert void und erwartet keine Parameter. Korrekt.

    *Klugsch... Modus on* Fast - Method ist ein Zeiger auf eine Memberfunktion 😉


Anmelden zum Antworten