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

时间:2015-01-10 14:10:09

标签: c++ pointers visual-c++ function-pointers member-function-pointers

让我通过一个例子(使用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. 

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

  

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

我收到了编译错误。

  

错误C2064:term不计算为采用0参数的函数

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

  明显调用的括号前面的

表达式必须具有   (指向)函数类型

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

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

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

2 个答案:

答案 0 :(得分:1)

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

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

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

  • 指向该功能的指针,
  • 您调用该函数的对象。

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

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

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

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

答案 1 :(得分:1)

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

(x->*f)();

由于您的会员指针名称(_tmain)为abcObj->fp,您需要使用

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

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

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