通过 class A 函数指针调用 class 成员函数(属于 class B)++

Calling class member function (of class B) thru the class A function pointer in VC++

让我通过一个例子来解释我的问题(VC++ 使用 VS2013 的代码)。

void Imhere(int num)
{
    printf_s("\n Hello World printed %d\n",num);
}
class Abc;
class Dllclas
{
    public:
    void dllFunc()
    {
        printf_s("\n Heelo this is DLl func\n");
    }
};

void outsideFunc()
{
    printf_s("\n Heelo this is outside func\n");
}
typedef void(*outsideFP)();
typedef void (Dllclas::*funcFP)();
class Abc
{
public:
    funcFP fp;
    outsideFP outFp;
    int a;
    void assignOUTFp()
    {
        outFp = &outsideFunc;
    }
    void assignFP()
    {
        fp = &(Dllclas::dllFunc);
    }
};

int _tmain(int argc, _TCHAR* argv[])
{

    Abc* abcObj1 = new Abc();
    abcObj1->a = 7;

    abcObj1->assignOUTFp(); 
    abcObj1->outFp();  // THIS FUNCTION CALL WORKS PERFECTLY FINE.

    abcObj1->assignFP();
    abcObj1->fp(); // COMPILATION ERROR. 

在此代码段中,在最后一行

abcObj1->fp(); // COMPILATION ERROR.

我遇到编译错误。

error C2064: term does not evaluate to a function taking 0 arguments

此外,如果我将鼠标悬停在 "abcObj1->fp()" 上,我会收到一个红色错误,显示为“

expression preceding parentheses of apparent call must have (pointer-to-) function type

在这里我可以调用任何 class 之外的函数“abcObj1->outFp();”。 因此,我知道我收到此错误的原因是,"abcObj1->fp();" 中的函数地址属于 class 成员函数,即 Dllclas class 的“dllFunc()”。

我也提到了link link 但我无法解决编译错误。

我能得到有关代码示例的帮助吗? 提前致谢。

第一个错误可以通过删除括号来修复:

fp = &Dllclas::dllFunc; // This will compile

第二个问题更难解决:回想一下,为了调用成员函数,您需要做两件事:

  • 指向函数的指针,并且
  • 调用函数的对象。

因此,您还需要一个 Dllclas 类型的 "target" 对象:

Dllclas target;
(target.*abcObj1->fp)();

这里的语法有点疯狂 - .* 将通过 abcObj1->fp 获得的函数指针应用到调用目标,即 Dllclas 类型的对象。如果您有指向目标的指针而不是目标本身,请使用 ->* 运算符:

Dllclas *targetPtr;
(targetPtr->*abcObj1->fp)();

调用成员函数指针的语法f如果x是一个指针是

(x->*f)();

由于您的成员指针(在_tmain中)的名称是abcObj->fp,您需要使用

(abcObj->*(abcObj->fp))();

您可以通过向 Abc 添加另一个成员来简化,例如

void callFP()
{
   (*fp)();
}