komisches typedef
-
template<typename Class> class MenuEntryMethod : public MenuEntry { public: typedef void (Class::*Method)(); private: Class* p; Method method; std::string name; protected: void do_action() { (p->*method)(); } std::string do_getName() const { return name; } public: MenuEntryMethod(Class* p, Method method, std::string const& name) : p(p), method(method), name(name) {} };Es geht mir um diese Zeile:
typedef void (Class::*Method)();Was soll das sein? Anscheinend wird void mit einem Funktionszeiger Method belegt, aber was soll das für einen Sinn machen?
Was wird dann hier erstellt: Method method;?
-
banshee schrieb:
Es geht mir um diese Zeile:
typedef void (Class::*Method)();Was soll das sein? Anscheinend wird void mit einem Funktionszeiger Method belegt, aber was soll das für einen Sinn machen?
Was wird dann hier erstellt: Method method;?Method wird als typedef auf void (Class::*)() definiert. Das ist ein Methodenzeiger (als Stichwort zum Suchen).
method ist dann einfach eine Variable dieses frisch definierten Typen.
-
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];
-
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
