Язык программирования C++. Вводный курс


Массивы указателей на функции


Можно объявить массив указателей на функции. Например:

int (*testCases[10])();

testCases – это массив из десяти элементов, каждый из которых является указателем на функцию, возвращающую значение типа int и не имеющую параметров.

Подобные объявления трудно читать, поскольку не сразу видно, с какой частью ассоциируется тип функции.

В этом случае помогает использование имен, определенных с помощью директивы typedef:

// typedef делает объявление более понятным

typedef int (*PFV)(); // typedef для указателя на функцию

PFV testCases[10];



Данное объявление эквивалентно предыдущему.

Вызов функций, адресуемых элементами массива testCases, выглядит следующим образом:

const int size = 10;

PFV testCases[size];

int testResults[size];

void runtests() {

    for ( int i = 0; i < size; ++i )

        // вызов через элемент массива

        testResults[ i ] = testCases[ i ]();

}

Массив указателей на функции может быть инициализирован списком, каждый элемент которого является функцией. Например:

int lexicoCompare( const string &, const string & );

int sizeCompare( const string &, const string & );

typedef int ( *PFI2S )( const string &, const string & );

PFI2S compareFuncs[2] =

{

    lexicoCompare,

    sizeCompare

};

Можно объявить и указатель на compareFuncs, его типом будет “указатель на массив указателей на функции”:

PFI2S (*pfCompare)[2] = compareFuncs;

Это объявление раскладывается на составные части следующим образом:

(*pfCompare)

Оператор разыменования говорит, что pfCompare является указателем. [2]

сообщает о количестве элементов массива:

 (*pfCompare) [2]

PFI2S – имя, определенное с помощью директивы typedef, называет тип элементов. Это “указатель на функцию, возвращающую int и имеющую два параметра типа const string &”. Тип элемента массива тот же, что и выражения &lexicoCompare.

Такой тип имеет и первый элемент массива compareFuncs, который может быть получен с помощью любого из выражений:

compareFunc[ 0 ];

(*pfCompare)[ 0 ];

Чтобы вызвать функцию lexicoCompare

через pfCompare, нужно написать одну из следующих инструкций:

// эквивалентные вызовы

pfCompare [ 0 ]( string1, string2 );     // сокращенная форма

((*pfCompare)[ 0 ])( string1, string2 ); // явная форма



Содержание раздела