Указатель на члена класса - PullRequest
2 голосов
/ 26 ноября 2011

В моем классе, если я хочу указать на члена класса,

struct S
{
     static int get();
     int do_something();
     int x;
};

Да,

int (*p)() = S::get;

К сожалению, это не для нестатического члена

int (*p)() = S::do_something; // error

Поскольку статическая функция-член - это обычная функция, и из приведенной ниже цитаты утверждается, что нестатическая функция-член также является обычной функцией, так почему же она не будет работать? что это значит?

(9.2 / 10) [Примечание: тип нестатической функции-члена является обычным тип функции, а тип нестатического члена данных является обычным тип объекта. Не существует специальных типов функций-членов или членов-данных типы. ]

Ответы [ 3 ]

5 голосов
/ 26 ноября 2011

Нестатические функции-члены не обычные функции. Вы не можете создавать бесплатные указатели на них.

Единственный допустимый способ ссылки на нестатическую функцию-член - через пару указателя / ссылки на экземпляр и функцию указателя на член:

S * p = &theobject;
int (S::*ptmf)() = &S::do_something;

return (p->*ptmf)();

В отличие от члена объектов (на который можно очень хорошо сформировать свободный указатель, например, &theobject.x), функции-члены более сложны, поскольку вам необходимо учитывать виртуальные функции: если S полиморфный базовый класс, а p является указателем на базу, а do_something() является виртуальным, тогда приведенный выше пример должен выполнить правильный тип отправки. Простой указатель свободной функции не может этого сделать.

(Более того, в стандарте не указывается, как реализуется каждая базовая реализация функций-членов, поэтому эта деталь никогда не предоставляется пользователю. Обычно это будет что-то вроде int S_mangled_name_do_something(S *);, но это не указано. )

Вот некоторые мои ответы на эту тему: # 1 , # 2 .

2 голосов
/ 26 ноября 2011

Тип функции обычный, а не тип функции-указателя.Указатель на нестатическую функцию-член должен быть объявлен так:

typedef int (S::*p)() ptr_to_member_of_s;
0 голосов
/ 26 ноября 2011
int (S::*p)() = S::do_something;

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

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