通过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类的)类成员函数的主要内容,如果未能解决你的问题,请参考以下文章