Описание тега pointer-to-member
Нестатические функции-члены класса 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;
}