从静态函数调用函数指针[关闭]

Posted

技术标签:

【中文标题】从静态函数调用函数指针[关闭]【英文标题】:Calling function pointer from static function [closed] 【发布时间】:2016-08-04 09:59:48 【问题描述】:

在一些名为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");

编辑:

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

错误:* 的右手运算符没有。

【问题讨论】:

我不知道MVCE错误是什么,不是全世界都是c++程序员。你有具体的答案吗? 你需要一个成员函数指针,并且你必须在interpretDelegate函数内部使用它之前声明它。 @Curnelious 他在问,你向我们提供minimal reproducible example。 可能重复或相关:How to invoke pointer to member function when it's a class data member? How to invoke pointer to member function from static member function?的可能重复 【参考方案1】:
float (*fpAction)(char*) = 0 ; // the actual pointer 

this 创建一个常规函数指针,而不是成员函数指针。 改为

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

在名为bLight 实例上调用此函数指针

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

附: 如果你想知道双 b 在那里做什么。 真的是 (b.*(b.fpAction))("arg"); b.fpAction 将指针标识为 Light 实例 b 的成员。 (b.*pointer)("arg") 在函数内部使用 'b' 作为 'this' 值调用函数指针。

【讨论】:

谢谢!这行得通,但现在像这样设置委托: void Light::setDelegate(float(fp)(char)) fpAction=fp; 给出错误,我想我做错了。 您需要更改委托调用以也使用正确的原型作为成员函数指针:float (Light::*fpAction)(char*) 谢谢,你真的帮了我。你能告诉我如何设置我的代表吗? (我对 C++ 很陌生),这是委托函数 void Light::setDelegate(float(fp)(char)) set here 【参考方案2】:

你的类型有误:

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

【讨论】:

非常感谢,但是:return (b.*fpAction)(arg);给出错误:“无效使用派系”,即使我更改为您在此处显示的内容。

以上是关于从静态函数调用函数指针[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

C++之静态

C++调用静态成员函数指针

从 C++ 中的共享库调用指向列表的静态指针

用向量中的指针调用函数的方法[关闭]

调用静态内联函数[关闭]

关于虚函数,类的内存分布以及类的成员函数调用原理