Когда я только начинал использовать С++, то всё время забывал синтаксис определения указателей на функции и особенно указателей на функции члены.
Позже узнал об одном небольшом lifehack'e, который помог мне избавиться от того что-бы держать в голове синтаксис определения указателей на ф-ции. Правда чуть позже этот всё само как-то осело у меня в голове и даже стало очевидно.
На днях показывал этот lifehack одному программисту и решил поделиться им здесь.
Что бы избежать долгих объяснений, приведу пример:
Допустим далее по коду нам нужно объявить указатель на test::foo.
Для того что-бы выяснить как он должен объявляться напишем следующее:
и попробуем собрать (для примера буду использовать компилятор от Microsoft, хотя проверял подобное на gcc и Comeau Online Compiller).
Получаем следующую ошибку:
Вот из этой ошибки мы и возьмем синтаксис объявления указателя на данный член ( явное указание типа вызова __thiscall — выкинем ):
Теперь добавим переменную и инициализацию:
Готово!
Позже узнал об одном небольшом lifehack'e, который помог мне избавиться от того что-бы держать в голове синтаксис определения указателей на ф-ции. Правда чуть позже этот всё само как-то осело у меня в голове и даже стало очевидно.
На днях показывал этот lifehack одному программисту и решил поделиться им здесь.
Что бы избежать долгих объяснений, приведу пример:
struct test { virtual int foo( const test& ) const { return 0; }; virtual ~test() {} };
Допустим далее по коду нам нужно объявить указатель на test::foo.
Для того что-бы выяснить как он должен объявляться напишем следующее:
char c = &test::foo;
и попробуем собрать (для примера буду использовать компилятор от Microsoft, хотя проверял подобное на gcc и Comeau Online Compiller).
Получаем следующую ошибку:
error C2440: 'initializing' : cannot convert from 'int (__thiscall test::* )(const test &) const' to 'char'
Вот из этой ошибки мы и возьмем синтаксис объявления указателя на данный член ( явное указание типа вызова __thiscall — выкинем ):
int ( test::* )(const test &) const
Теперь добавим переменную и инициализацию:
int ( test::* func )(const test &) const = &test::foo;
Готово!