Описание тега pointer-to-member

None Этот тег обычно используется с вопросами о создании указателя на нестатическую функцию-член класса в языке программирования C++. Для указателей стандартных функций в C и C++ используйте вместо этого тег "указатели на функции". По вопросам, касающимся объектов-функторов в C++, используйте тег `functor`.

Нестатические функции-члены класса C++ ожидают, что часть списка аргументов будет указателем на объект класса, поэтому указание указателя на функцию-член имеет синтаксис, отличный от обычного объявления указателя функции.

Синтаксис указателя на нестатическую функцию-член класса должен включать не только указатель функции, но и this указатель на объект.

Объявление указателя стандартной функции для свободной функции (функции, не являющейся членом класса), используемой как в C, так и в C++, принимает форму:

type FreeFunc (argType1 x, argType2 y);        // free function declaration
type (*pFunc)(argType1, argType2) = FreeFunc;  // pointer to the function

Если у вас есть класс, объявленный примерно так:

class Dclass {
public:
    static type StMemFunc (argType1 x, argType2 y);  // static class function
    type MemFunc (argType1 x, argType2 y);           // non-static class function
};

Объявление указателя стандартной функции для статической функции в классе принимает форму:

type (*pFunc)(argType1, argType2) = &Dclass::StMemFunc; // Declare pointer

pFunc (x, y);    // use the pointer to a static member function of a class

Однако указатель на нестатическую функцию-член объявления класса принимает форму

type (Dclass::*pFunc2)(argType1, argType2) = &Dclass::MemFunc;

Dclass thing;

(thing.*pFunc2) (x, y);   // use the pointer to a non-static member function of a class

Не забывайте скобки вокруг объекта и его имени функции, чтобы гарантировать, что весь указатель на функцию-член объекта используется со списком аргументов. В противном случае список аргументов будет ассоциироваться с правой большей частью объекта и его именем функции, с самим именем функции.

Если класс содержит указатель на функцию, разрешающий перенаправление внутри самого класса, например, для выбора функции на основе некоторых критериев, принимает форму:

class Dclass {
public:
    type (Dclass::*pFunc) (argType1 x, argType2 y);
    // .. other methods include something that chooses a function for the pointer
private:
    type Func1 (argType1 x, argType2 y);
    type Func2 (argType1 x, argType2 y);
    type Func3 (argType1 x, argType2 y);
};

Dclass thing;

(thing.*thing.pFunc) (x, y);  // call the non-static function member of the Dclass class for the thing object

Простой пример, показывающий все эти варианты.

class Dclass {
public:
    enum Types {Type0, Type1, Type2, Type3};
    static int StMemFunc(int x, int y) { return x + y; }
    int(Dclass::*pFunc) (int x, int y);
    Dclass(Types j = Type0) {
        switch (j) {
            case Type1:
                pFunc = &Dclass::type1;
                break;
            case Type2:
                pFunc = &Dclass::type2;
                break;
            case Type3:
                pFunc = &Dclass::type3;
                break;
            default:
                pFunc = &Dclass::type0;
                break;
        }
    }
    int MemFunc(int x, int y) { return (x + y) * 2; }
private:
    int type0(int x, int y) { return 0; }
    int type1(int x, int y) { return (x + y) * 100; }
    int type2(int x, int y) { return (x + y) * 200; }
    int type3(int x, int y) { return (x + y) * 300; }
};

int main(int argc, char* argv[])
{

    int(*pFuncx)(int, int) = &Dclass::StMemFunc;  // pointer to static member function

    int(Dclass::*pFunc2)(int, int) = &Dclass::MemFunc; // pointer to non-static member function

    pFuncx(1, 2);     // call static function of the Dclass class, no object required

    Dclass thing (Dclass::Type3);   // construct an object of the class.

    pFuncx(1, 2);     // call static function of the Dclass class. same as previous since static function

    // following uses of class member function requires that an object of the
    // class be constructed and specified in the function call.

    (thing.*pFunc2)(3, 4);  // call the non-static function of the Dclass class for the thing object.

    (thing.*thing.pFunc) (5, 6);  // call the non-static function member of the Dclass class for the thing object

    return 0;
}