通过VC++中的A类函数指针调用(B类的)类成员函数

Posted

技术标签:

【中文标题】通过VC++中的A类函数指针调用(B类的)类成员函数【英文标题】:Calling class member function (of class B) thru the class A function pointer in VC++ 【发布时间】:2015-01-10 14:10:08 【问题描述】:

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

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. 

在这段代码sn-p中,在最后一行

abcObj1->fp(); // 编译错误。

我收到编译错误。

错误 C2064:术语不计算为采用 0 个参数的函数

另外,如果我将鼠标悬停在“abcObj1->fp()”上,我会收到一个红色错误,上面写着“

明显调用括号前的表达式必须有 (pointer-to-) 函数类型

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

我也参考了链接 link 但我无法解决编译错误。

我可以就代码示例获得帮助吗? 提前致谢。

【问题讨论】:

我找不到FP 成员。你的意思是fp 是的,它是“fp”而不是“FP”(错字),对不起。刚才更正了。谢谢。 fp 是指向Dllclas 成员的指针。您需要一个 Dllclas 的实例来调用该成员 - 正如您不能在没有 Dllclas 实例的情况下直接调用 dllFunc 【参考方案1】:

第一个错误可以通过去掉括号来修复:

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

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

指向函数的指针,以及 调用函数的对象。

因此,您还需要Dllclas 类型的“目标”对象:

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

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

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

【讨论】:

【参考方案2】:

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

(x->*f)();

由于你的成员指针的名字(_tmain)是abcObj->fp,你需要使用

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

您可以通过向Abc 添加其他成员来简化,例如

void callFP()

   (*fp)();

【讨论】:

以上是关于通过VC++中的A类函数指针调用(B类的)类成员函数的主要内容,如果未能解决你的问题,请参考以下文章

C++函数指针与成员函数指针

为什么通过空指针(NULL)能够正确调用类的部分成员函数

C++|详解类成员指针:数据成员指针和成员函数指针及应用场合

c++类的成员函数指针如何转为普通指针

基类与派生类的指针和成员函数调用原理

C++ 类成员函数地址