【问题标题】:Calling class member function (of class B) thru the class A function pointer in VC++通过VC++中的A类函数指针调用(B类的)类成员函数
【发布时间】: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

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


【解决方案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)();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多