Подтвердить что ты не робот

Как определить указатель функции, указывающий на статическую функцию-член?

#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;
}
4b9b3361

Ответ 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();
}

Подробнее см. ссылку .