Как читать этот тип указателя в C ++? - PullRequest
1 голос
/ 18 августа 2010
CUnknown* (*)( LPUNKNOWN pUnk, HRESULT* phr );

Кажется, у меня всегда были проблемы с чтением таких сложных указателей ..

Как вы читаете это? что если выражение еще длиннее?

Ответы [ 7 ]

3 голосов
/ 18 августа 2010

Из книг и Uni я узнал, что нужно начинать с середины и двигаться вперед и назад.Хитрость заключается в том, чтобы делать это медленно и знать, где на самом деле находится середина.

У вас есть

CUnknown* (*)( LPUNKNOWN pUnk, HRESULT* phr );

, это указатель (*)

Теперь мы идемсправа: это указатель на функцию, потому что следующая вещь - это (

Аргументами функции являются LPUNKNOWN и указатель на HRESULT, и все.

Теперь мы идем налево: функция возвращает указатель на CUnknown.

Итак, как утверждают все, это указатель на функцию, которая принимает два аргумента -a LPUNKNOWN и указатель на HRESULT - и возвращает указатель на CUnknown.

Красоты связи: this и this .

3 голосов
/ 18 августа 2010

Все сказали, что это такое, но вы спросили, как это прочитать.

Синтаксис указателя на функцию выглядит следующим образом:

RETURN_VALUE (*POINTER_NAME) (ARGUMENT LIST)

Итак

foo (*bar) (baz)

- указатель на функцию, принимающую baz и возвращающую foo, а указатель называется bar.

В случае, если вы хотите только написать тип указателя на функцию, а не объявить его, вы просто пропускаете имя, например

RETURN_VALUE (*) (ARGUMENT_LIST)

как вы видите здесь.

Для разбора трудных для понимания объявлений C есть хорошая программа под названием cdecl, доступная в большинстве Linux и Unix-подобных систем, а также в виде веб-приложения: http://cdecl.org/

1 голос
/ 18 августа 2010

Правило Спираль по часовой стрелке помогает мне понять такие вещи.С сайта:

  1. Начиная с неизвестного элемента, двигайтесь по спирали / по часовой стрелке;при обнаружении следующих элементов замените их соответствующими английскими выражениями:
  2. Продолжайте делать это по спирали / по часовой стрелке, пока все жетоны не будут закрыты.

  3. Всегда сначала разрешайте все в скобках!

    [X] или []

=> Размер массива X ... или Размер неопределенного массива ...

(type1, type2)

=> функция, передающая тип1 и тип2, возвращающие ...

*

=> указатель (и) на ...

0 голосов
/ 18 августа 2010

Для некоторой функции:

int f(int a, int& b, int* c);

Тип выражения:

&f

Или, что эквивалентно:

f

Is:

int(*)(int, int&, int*)

И простой способ запомнить, что спецификатор типа указателя на функцию аналогичен объявлению функции, за исключением того, что имя заменено на (*).Вы также можете выполнить typedef:

typedef int(*ftype)(int, int&, int*);

И теперь вы можете написать:

ftype func = f;

Вместо:

int(*func)(int, int&, int*) = f;
0 голосов
/ 18 августа 2010

Я думаю, что это указатель на функцию, принимающую LPUNKNOWN и указатель на HRESULT, возвращающий указатель на CUnknown

0 голосов
/ 18 августа 2010

это указатель на функцию с двумя аргументами, который возвращает CUnknown *

0 голосов
/ 18 августа 2010

Это указатель на функцию, которая принимает аргументы 'LPUNKNOWN pUnk, HRESULT * phr' и возвращает указатель на CUnknown.

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