2

让我通过一个示例(使用VS2013的VC++代码)来解释我的问题。通过VC++中的类A函数指针调用类成员函数(类B)

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:术语不计算为服用0参数

另外,如果我悬停我的鼠标在“abcObj1-> FP()”,我得到一个红色的错误读取功能“前述显而易见呼叫的括号

表达式必须具有 (指针TO-)功能类型

在这里,我'能够调用函数“abcObj1-> outFp();这是在任何阶级之外。 因此,我知道我得到这个错误的原因是因为,函数地址出现在“abcObj1-> fp();”属于Dllclas类中的一个成员函数,即“dllFunc()。

我也refered的链接 link但我无法解析编译错误。

我能请得到与代码示例帮助? 预先感谢

+0

我找不到'FP'成员。你的意思是'fp'? – dasblinkenlight

+0

是的,这是“fp”而不是“FP”(错字),我很抱歉。现在纠正它。谢谢。 – codeLover

+0

'fp'是'Dllclas'成员的指针。你需要一个'Dllclas'的实例来调用这个成员 - 就​​像你不能直接调用'dllFunc'而没有'Dllclas'实例一样。 –

回答

1

第一误差可通过去除括号被固定:

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

第二个问题是难以解决:回顾,以便调用一个构件功能,您需要两两件事:

  • 的指针功能,
  • 在其上调用该函数的对象。

因此,你需要Dllclas类型的“目标”对象,以及:

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

的语法是有点疯狂这里 - .*通过abcObj1->fp获得的函数指针适用于调用的目标,即类型为Dllclas的对象。如果你有一个指向目标,而不是目标本身,使用->*操作:

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

完美的工作表示感谢。 – codeLover

1

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

(x->*f)(); 

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

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

可以简化通过添加另一个成员到Abc,就像

void callFP() 
{ 
    (*fp)(); 
} 
相关问题