Как определить указатель функции, указывающий на статическую функцию-член?
#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;
}
Вопрос: Мне нужно определить указатель функции PPMF2 на указание на статическую функцию-член verifyAddress2. Как я могу это сделать?
#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;
}
Ответы
Ответ 1
Указатель на статическую функцию-член - это обычный указатель на функцию. typedef void (*PPMF2)()
. Вы назначаете его статической функции-члену, как вы назначаете любой указатель на функцию, только то, что статическая функция-член находится внутри области видимости класса:
PPMF2 myfunc = &MyClass::StaticMemberFunc;
Ответ 2
О статической функции-члене гарантии:
C++ ISO/IEC 14882 2003-10-15 гласит, что
5.2.2 Существует два типа вызова функции: вызов обычной функции и функция-член 57) (9.3) вызов....
57) Статическая функция-член (9.4) является обычной функцией.
Теоретически static-member-функции могут иметь другое соглашение о вызовах.
Но стандарт позволяет нам использовать такие вещи...
Ответ:
typedef void (Person:: * PPMF2)() = > typedef void (* PPMF2)()
Ответ 3
Если эта функция является статической, для нее не требуется (неявный) this
указатель. Поэтому указатель на статическую функцию-член не совпадает с указателем на функцию-член:
#include "stdafx.h"
class Person;
typedef void (Person::*PPMF)();
typedef /*static*/ void (*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();
(*pmf)();
return 0;
}
EDIT:
удалил оскорбительный статический текст из typedef.
Ответ 4
#include<iostream>
using namespace std;
class A
{
private:
int x,y;
static int a;
public:
A()
{
x = 10;
y = 11;
}
~A()
{
}
void displayNonStatic()
{
cout<<x<<" "<<y<<endl;
}
void displayStatic()
{
cout<<a<<endl;
}
};
int A::a = 12;
int main()
{
typedef void (A::*NonStatic)(void);
typedef void (A::*Static)(void);
A a1;
NonStatic _nstatic = &A::displayNonStatic ;
Static _static = &A::displayStatic;
// Always make sure that call to the pointer to the member functions is made within the context of the instance.
//Correct way to call the pointer within the context of the instance " a1 " .
(a1.*_nstatic)();
(a1.*_static)();
//Error case given below, the pointer is not called within the context of the instance
// (*_nstatic)(); ->error
// (*_static)(); ->error
getchar();
}
Подробнее см. ссылку .