2015-04-10 4 views
3

я наткнулся на коде сегодня, который выглядел как:Странного использование звездочки во время разыменования

result = (this->*(*c))(&param) 

Основная часть, которая меня смущает это this->*(*c) Что значит иметь операторы звездочки между стрелкой (->) и имя переменной, к которой мы обращаемся (c).

+0

Если у кого-то есть идеи по редактированию названия, чтобы люди с тем же вопросом, что и я, могли бы легко найти этот вопрос, отредактируйте его. – turbulencetoo

+5

'-> *' - один оператор. '*' - это другое. Это всего лишь последовательность составных подвыражений. –

+0

Возможно, стрела отбрасывает меня; что бы выглядел этот код, если он состоял только из '.' и' * '? Is '((* this). * (* C))' действительный код? – turbulencetoo

ответ

4

У вас есть оператор, которого вы не видите очень часто.

->* - это единственный оператор. Он представляет собой указатель на основе .* и является оператором доступа к члену.

Используется, если у вас есть объект для использования элемента (например, функция), но не знаю конкретного элемента (он хранится в переменной).

разобьем его:

this  // object to work on 
->*  // member access operator 
(*c)  // dereference pointer pointing to member function (c is a pointer-to-pointer) 
(&param) // call member function stored in c on this passing &param to the function 

Смотрите также: http://en.cppreference.com/w/cpp/language/operator_member_access

Edit: Это сообщение также содержит хорошее объяснений о том, что происходит здесь: https://stackoverflow.com/a/6586248/1314789

+1

'c' смотрит на меня как на указатель на указатель * на функцию-член. В противном случае достаточно синтаксиса '(this -> * c) (& param)'. – 0x499602D2

+0

Да, хотя я тоже так, но не упоминал об этом. Я добавлю это к ответу, спасибо. – Excelcius

0

Дерево разбора для выражение таково:

      = 
       /   \ 
       result  function call 
          /  \ 
          ->*  & 
         / \  | 
         this * param 
           | 
           c 

Скобки необходимы из-за скучной грамматики.