Можно ли создать указатель на нестатическую функцию-член в C ++? - PullRequest
0 голосов
/ 22 февраля 2012

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

Спасибо ...

Ответы [ 2 ]

2 голосов
/ 22 февраля 2012

Короче говоря: да, это возможно, и нет, это не делает то, что вы думаете.

Важным фактом является то, что нестатические функции-члены не являются функциями (точно так же, как пихта Дугласа не пихта). Это член функции, и это нечто другое. Они могут быть вызваны только для данного экземпляра объекта.

Таким образом, чтобы вызвать функцию-член X::foo() данного экземпляра X a;, т. Е. Выполнить вызов a.foo(), вам нужна как информация, которую вы хотите использовать X::foo(), так и та, которую вы хотите вызвать его в экземпляре a. Первый из них предоставляется указателем на функцию-член , который не является указателем , а второй - указателем экземпляра или ссылкой:

struct X { int foo(bool, char); };  // class definition

X a;          // an instance
X * p = &a;   // just for demonstration

int (X::*)(bool, char) ptmf = &X::foo;   // pointer-to-member-function

Теперь для вызова:

(a.*ptmf)(false, 'a');
(p->*ptmp)(true, 'z');

В двух словах: foo само по себе не позволяет вам звонить. Вызываемая сущность - это пара (&X::foo, a), которая позволяет вам звонить a.foo().

0 голосов
/ 22 февраля 2012

Да, возможно создать указатель на функции-члены в C ++. См. Этот FAQ: указатели на участников

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...