通过 class A 函数指针调用 class 成员函数(属于 class B)++
Calling class member function (of class B) thru the class A function pointer in VC++
让我通过一个例子来解释我的问题(VC++ 使用 VS2013 的代码)。
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(); // COMPILATION ERROR.
我遇到编译错误。
error C2064: term does not evaluate to a function taking 0 arguments
此外,如果我将鼠标悬停在 "abcObj1->fp()" 上,我会收到一个红色错误,显示为“
expression preceding parentheses of apparent call must have
(pointer-to-) function type
在这里我可以调用任何 class 之外的函数“abcObj1->outFp();”。
因此,我知道我收到此错误的原因是,"abcObj1->fp();" 中的函数地址属于 class 成员函数,即 Dllclas class 的“dllFunc()”。
我也提到了link
link 但我无法解决编译错误。
我能得到有关代码示例的帮助吗?
提前致谢。
第一个错误可以通过删除括号来修复:
fp = &Dllclas::dllFunc; // This will compile
第二个问题更难解决:回想一下,为了调用成员函数,您需要做两件事:
- 指向函数的指针,并且
- 调用函数的对象。
因此,您还需要一个 Dllclas
类型的 "target" 对象:
Dllclas target;
(target.*abcObj1->fp)();
这里的语法有点疯狂 - .*
将通过 abcObj1->fp
获得的函数指针应用到调用目标,即 Dllclas
类型的对象。如果您有指向目标的指针而不是目标本身,请使用 ->*
运算符:
Dllclas *targetPtr;
(targetPtr->*abcObj1->fp)();
调用成员函数指针的语法f
如果x
是一个指针是
(x->*f)();
由于您的成员指针(在_tmain
中)的名称是abcObj->fp
,您需要使用
(abcObj->*(abcObj->fp))();
您可以通过向 Abc
添加另一个成员来简化,例如
void callFP()
{
(*fp)();
}
让我通过一个例子来解释我的问题(VC++ 使用 VS2013 的代码)。
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(); // COMPILATION ERROR.
我遇到编译错误。
error C2064: term does not evaluate to a function taking 0 arguments
此外,如果我将鼠标悬停在 "abcObj1->fp()" 上,我会收到一个红色错误,显示为“
expression preceding parentheses of apparent call must have (pointer-to-) function type
在这里我可以调用任何 class 之外的函数“abcObj1->outFp();”。 因此,我知道我收到此错误的原因是,"abcObj1->fp();" 中的函数地址属于 class 成员函数,即 Dllclas class 的“dllFunc()”。
我也提到了link link 但我无法解决编译错误。
我能得到有关代码示例的帮助吗? 提前致谢。
第一个错误可以通过删除括号来修复:
fp = &Dllclas::dllFunc; // This will compile
第二个问题更难解决:回想一下,为了调用成员函数,您需要做两件事:
- 指向函数的指针,并且
- 调用函数的对象。
因此,您还需要一个 Dllclas
类型的 "target" 对象:
Dllclas target;
(target.*abcObj1->fp)();
这里的语法有点疯狂 - .*
将通过 abcObj1->fp
获得的函数指针应用到调用目标,即 Dllclas
类型的对象。如果您有指向目标的指针而不是目标本身,请使用 ->*
运算符:
Dllclas *targetPtr;
(targetPtr->*abcObj1->fp)();
调用成员函数指针的语法f
如果x
是一个指针是
(x->*f)();
由于您的成员指针(在_tmain
中)的名称是abcObj->fp
,您需要使用
(abcObj->*(abcObj->fp))();
您可以通过向 Abc
添加另一个成员来简化,例如
void callFP()
{
(*fp)();
}