MyTetra Share
Делитесь знаниями!
Синтаксис объявления указателей на функции в С++ - как построить тип указателя на функцию
Время создания: 11.04.2010 00:43
Раздел: Компьютер - Программирование - Язык C++ (Си++)
Запись: xintrea/mytetra_syncro/master/base/0000001486/text.html на raw.github.com

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


Позже узнал об одном небольшом lifehack'e, который помог мне избавиться от того что-бы держать в голове синтаксис определения указателей на функции. Правда чуть позже этот всё само как-то осело у меня в голове и даже стало очевидно.


На днях показывал этот lifehack одному программисту и решил поделиться им здесь.


Что бы избежать долгих объяснений, приведу пример. Имеется класс test с виртуальным методом foo и деструктором ~test:


class 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


Теперь добавим имя создаваемой переменной func, которая будет являться указателем на функцию, и сделаем ее инициализацию:


int ( test::* func )(const test &) const = &test::foo;


Готово!



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