Использование указателей на функции-члены класса
Можно определить указатель на функцию-член класса. Синтаксис определения следующий:
<возвр_тип> (<имя_класса>::*<имя_указателя>) (< параметры>);
Например:
void (T::* funcPtr) (int x, int у);
Таким образом, синтаксис определения указателя на функцию-член класса отличается от объявления указателя на обычную функцию тем, что в круглых скобках указывается имя класса, отделенное от имени указателя оператором расширения области видимости, а само имя указателя предваряется звездочкой. Эта звездочка должна напомнить программисту, что при использовании такой указатель должен разыменовываться (в отличие от указателя на обычную функцию).
Например: this ->* funcPtr (x, y);
или
* this. * funcPtr (x, y);
Указателю на функцию-член класса передается скрытый указатель this (иначе ему нельзя было бы присвоить значение адреса некоторой функции-члена класса).
Следующий пример демонстрирует использование указателей на функцию-член.
class T
{
int a;
public:
T (int A): a (A){}
void MembFunc () { printf ("Hello!");}
void CallMembFunc (void (T::* funcPtr)())
{
this ->*funcPtr();
}
};
int main ()
{
void (T::* funcPtr)()=& T:: MembFunc;
T ob (2000);
ob. CallMembFunc (funcPtr);
}
C++ накладывает определенные ограничения на использование указателей на функции-члены класса:
o указатель на функцию-член класса не может ссылаться на статическую функцию-член класса (так как ей не передается указатель this);
o указатель на функцию-член класса не может быть преобразован в указатель на обычную функцию, не являющуюся членом какого-нибудь класса (по той же причине).
Дата добавления: 2015-09-27 | Просмотры: 406 | Нарушение авторских прав
|