C ++ typedef-Memberfunktion Signatursyntax
Möchte ich erklären, geben Sie die definition einer member-Funktion-Signatur. Globale Funktion Typdefinitionen wie folgt Aussehen:
typedef int (function_signature)(int, int);
typedef int (*function_pointer) (int, int);
Aber ich bin nicht in der Lage, die gleiche Sache für eine member-Funktion:
typedef int (foo::memberf_signature)(int, int); //memberf_pointer is not a member of foo
typedef int (foo::*memberf_pointer)(int, int);
Klingt es logisch für mich, weil "foo::" ist die syntax für Zugriff auf ein Element in der Klasse foo.
Wie kann ich typedef nur die Signatur?
InformationsquelleAutor der Frage 0xbadf00d | 2011-01-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Für Fragen in Bezug auf die peinliche Funktion-Zeiger-syntax, ich persönlich benutze ein cheat-sheet: Die Funktion Pointer Tutorial (hier herunterladenDank Vektor für den Hinweis it out).
Die Signatur einer Memberfunktion, jedoch ist ein bisschen anders von der Signatur einer regulären Funktion, die Sie erlebt.
Wie Sie wahrscheinlich wissen, eine member-Funktion hat einen versteckten parameter,
this
an, deren Typ muss angegeben werden.lässt Sie angeben, dass das erste element an die Funktion übergeben wird ein
Foo*
(und damit Ihre Methode wirklich dauert 3 Argumente, wenn Sie daran denken, nicht nur 2.Aber es ist ein weiterer Grund zu sein, Sie zu zwingen, geben Sie den Typ.
Einen Funktionszeiger beziehen könnte eine virtuelle Funktion, in dem Fall können die Dinge kompliziert werden. Also sehr Größe der in-memory-Darstellung ändert sich je nach der Art der Funktion. In der Tat, auf Visual Studio eine Funktion Zeiger, die Größe kann variieren zwischen 1 und 4 mal die grösse eines normalen Zeiger. Dies hängt davon ab, ob die Funktion virtuell ist, insbesondere.
Daher die Klasse die Funktion bezieht sich auf ist Teil der Signaturund es ist kein work-around.
InformationsquelleAutor der Antwort Matthieu M.
Können Sie Faktor aus der Ziel-Klasse in der modernen C++ (post 11), die durch die Nutzung der 'typedefing' Qualitäten von Vorlage Aliase. Was Sie brauchen Aussehen würde wie:
Doch an der Stelle der Deklaration, ein Zeiger auf member-Funktion unter Verwendung dieser syntax angeben müssen, die Ziel-Klasse:
InformationsquelleAutor der Antwort Nikos Athanasiou
Es funktioniert für mich:
InformationsquelleAutor der Antwort TonyK
Der Grund, warum es nicht funktioniert mit Ihrem aktuellen syntax ist, dass die Rangfolge bestimmt, die Sie sich beziehen, um eine Funktion namens
foo::memberf_signature
nicht jede Art von Typ.Ich weiß es nicht sicher, ob Sie dies tun oder nicht, aber ich konnte nicht kommen mit jeder Kombination der Runden Klammer, die induziert den code zu kompilieren mit g++ 4.2.
InformationsquelleAutor der Antwort Mark B
Naja, eigentlich kann es nicht funktionieren (zumindest kenne ich keine Möglichkeit, die Verwendung von g++);
Mit borland c++ compiler würde es den __Schließung Stichwort.
Der Grund, warum es nicht kompiliert ist, dass sizeof die functionpointer (auf einer x86-Maschine) nimmt immer <<32-bit>> aber wenn Sie wollen, zu einem Punkt der Klasse (Schnittstelle) Unterschrift, sizeof hat sein 64-bit: 32-bit für den this-Zeiger (wie die Klassen-Schnittstelle in den Speicher nur einmal) und 32-bit für die eigentliche Funktion
Aber die __Schließung keyword ist ein bcb-Sprache 'hack' nicht standardisiert...
InformationsquelleAutor der Antwort googling