2016-08-04 7 views
-4

Внутри какого-то класса под названием Light у меня есть статическая функция.Указатель функции вызова из статической функции

Я хотел бы «огонь» делегат от него,

Inside Light.h 

static float intepreterDelegate(char *arg){ 



     // here I need to call the function pointer inside Light itself 
     Light b; 
     return b.fpAction(arg); // ** error: "expected unqualified id" 
     }; 

    float (*fpAction)(char*) = 0 ; // the actual pointer 

Как создать правильный синтаксис для этого?

b.(*fpAction)("arg"); 

EDIT:

(b.*b.fpAction)(arg); 

ОШИБКА: правый оператор рукой * имеет не.

+2

MCVE? "ошибка"..? –

+0

Я не знаю, что такое ошибка MVCE, а не весь мир - программисты на C++. У вас есть конкретный ответ? – Curnelious

+0

Вам нужен указатель на функцию-член, и вы должны объявить его перед тем, как использовать его в функции 'interpectionDelegate'. – Quentin

ответ

1
float (*fpAction)(char*) = 0 ; // the actual pointer 

это создает регулярную функцию указателя, а не член-функция указателя. изменится

float (Light::*fpAction)(char*) = 0 ; 

вызова этой функции указатель на Light экземпляра с именем b

float result = (b.*b.fpAction)("arg"); 

P.S. , если вам интересно, что там делает двойной б. Это действительно (b. * (B.fpAction)) ("arg"); b.fpAction идентифицирует указатель как член экземпляра Light b. (b. * Pointer) ("arg") вызывает функцию-указатель, используя значение 'b' в качестве этого значения внутри функции.

+0

Спасибо! это сработало, но теперь установите делегат следующим образом: void Light :: setDelegate (float (* fp) (char *)) { fpAction = fp; } дает ошибку, я думаю, что я делаю это неправильно. – Curnelious

+0

вам нужно изменить вызов делегата, чтобы также использовать соответствующий прототип для указателя функции-члена: float (Light :: * fpAction) (char *) – oreubens

+0

Спасибо, ты действительно мне помог. Не могли бы вы показать, как правильно настроить моего делегата? (Я очень новичок в C++), это функция делегата void Light :: setDelegate (float (fp) (char)) {set here} – Curnelious

1

У вас есть неправильный тип:

float (*fpAction)(char*) = 0 ; // the actual pointer 

Должно быть

float (Light::*fpAction)(char*) = 0 ; // the actual pointer 

, а затем

fpAction = &Light::myMethod; 

и

static float intepreterDelegate(char *arg){ 
    Light b; 
    return (b.*fpAction)(arg); 
} 

Demo

+0

Большое спасибо, но: return (b. * fpAction) (arg); дает ошибку: «неправильное использование фракции», даже если я перейду к тому, что вы здесь показали. – Curnelious

+0

Демонстрационная ссылка добавлена. – Jarod42