Я не думаю, що тут хтось пояснив, що одне питання полягає в тому, що вам потрібні " покажчики членів ", а не звичайні покажчики функцій.
Покажчики членів на функції - це не просто функціональні покажчики. З точки зору реалізації, компілятор не може використовувати просту адресу функції, оскільки, як правило, ви не знаєте адреси для виклику, поки не дізнаєтесь, для якого об'єкта потрібно відкинути (подумайте, віртуальних функцій). Вам також потрібно знати об'єкт, щоб this
, звичайно, надати імпліцитний параметр.
Сказавши, що вони вам потрібні, зараз я скажу, що вам справді потрібно уникати їх. Серйозно, покажчики членів - це біль. Набагато розумніше дивитись на об'єктно-орієнтовані шаблони дизайну, які досягають тієї самої мети, або використовувати boost::function
або що-небудь, як було сказано вище - якщо припустити, що ви зробите такий вибір, тобто.
Якщо ви постачаєте цей покажчик функції на існуючий код, тож вам дійсно потрібен простий вказівник функції, ви повинні написати функцію як статичний член класу. Функція статичного члена не розуміє this
, тому вам потрібно буде передати об'єкт як явний параметр. Колись у цих напрямках існувала не така незвична ідіома для роботи зі старим кодом С, який потребує функціональних покажчиків
class myclass
{
public:
virtual void myrealmethod () = 0;
static void myfunction (myclass *p);
}
void myclass::myfunction (myclass *p)
{
p->myrealmethod ();
}
Оскільки myfunction
це дійсно лише нормальна функція (питання щодо обсягу вбік), то вказівник на функцію може бути знайдений звичайним способом C.
EDIT - такий метод називається "метод класу" або "статична функція члена". Основна відмінність від функції, яка не є членом, полягає в тому, що якщо ви посилаєтесь на неї поза класом, ви повинні вказати область, використовуючи ::
оператор роздільної здатності. Наприклад, щоб отримати вказівник функції, використовуйте &myclass::myfunction
та називайте його use myclass::myfunction (arg);
.
Такі речі є досить поширеними при використанні старих API Win32, які спочатку були розроблені для C, а не C ++. Звичайно, у цьому випадку параметр, як правило, є LPARAM або подібний, а не покажчик, і потрібне деяке кастинг.