Wie definiert man einen Funktionszeiger, der auf eine statische Elementfunktion zeigt?
#include "stdafx.h"
class Person;
typedef void (Person::*PPMF)();
//error C2159: more than one storage class specified
typedef static void (Person::*PPMF2)();
class Person
{
public:
static PPMF verificationFUnction()
{
return &Person::verifyAddress;
}
//error C2440: 'return' : cannot convert from
//'void (__cdecl *)(void)' to 'PPMF2'
PPMF2 verificationFUnction2()
{
return &Person::verifyAddress2;
}
private:
void verifyAddress() {}
static void verifyAddress2() {}
};
int _tmain(int argc, _TCHAR* argv[])
{
Person scott;
PPMF pmf = scott.verificationFUnction();
(scott.*pmf)();
return 0;
}
Frage: muss ich eine Funktion definieren, die Zeiger PPMF2 zu zeigen, um eine statische member-Funktion verifyAddress2. Wie kann ich es tun?
#include "stdafx.h"
class Person;
typedef void (Person::*PPMF)();
typedef void (Person::*PPMF2)();
class Person
{
public:
static PPMF verificationFUnction()
{
return &Person::verifyAddress;
}
PPMF2 verificationFUnction2()
{
return &Person::verifyAddress2;
}
private:
void verifyAddress() {}
static void verifyAddress2() {}
};
int _tmain(int argc, _TCHAR* argv[])
{
Person scott;
PPMF pmf = scott.verificationFUnction();
(scott.*pmf)();
return 0;
}
InformationsquelleAutor der Frage q0987 | 2011-03-31
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einen Zeiger auf eine statische member-Funktion ist nur ein normaler Funktionszeiger.
typedef void (*PPMF2)()
. Sie weisen Sie eine statische member-Funktion wie ordnen Sie jeder Funktion Zeiger, nur, dass die statische member-Funktion ist in der Klasse Umfang:InformationsquelleAutor der Antwort Xeo
Etwa die statische member-Funktion garantiert:
С++ ISO/IEC 14882 2003-10-15 sagt, dass
Theoretisch static-member-Funktionen, die eine Aufruf-Konvention.
Aber standart ermöglichen es uns, zu nutzen, die auf so etwas...
Antwort:
typedef void (Person::*PPMF2)() => typedef void (*PPMF2)()
InformationsquelleAutor der Antwort bruziuz
Wenn die Funktion statisch ist es nicht erforderlich, eine (implizite)
this
Zeiger aufgerufen werden. Daher ist ein Zeiger auf eine statische member-Funktion ist nicht das gleiche wie eine member-Funktion-Zeiger:EDIT:
entfernt, die problematische Statik aus der Typdefinition.
InformationsquelleAutor der Antwort hkaiser
Beziehen sich auf die link für weitere Informationen.
InformationsquelleAutor der Antwort debapritam chakra