MyTetra Share
Делитесь знаниями!
О, смотри-ка какое хорошее место. Дайте два!
Синтаксис объявления указателей на функции в С++
11.04.2010
00:43
Раздел: Компьютер - Программирование - Язык C++

Синтаксис объявления указателей на функции в С++



Когда я только начинал использовать С++, то всё время забывал синтаксис определения указателей на функции и особенно указателей на функции члены.


Позже узнал об одном небольшом 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;


Готово!



Комментарий:


Совершенно непонятно, почему автор сразу написал "&test::foo", а затем выяснил его тип. Почему он не написал "*test::foo" или "test::foo*" или еще как нибудь, если не помнит синтаксиса? Если написать по-другому, тогда и тип другой получится. Но узнав этот тип можно будет тоже приравнять переменную, и формально компиляция пройдет, но работать не будет.


Так же в этом разделе:
← Содержание ...
 
MyTetra Share v.0.35
Яндекс индекс цитирования