Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 通过VC+中的类A函数指针调用类成员函数(类B)+;_C++_Pointers_Visual C++_Function Pointers_Member Function Pointers - Fatal编程技术网

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

C++ 通过VC+中的类A函数指针调用类成员函数(类B)+;,c++,pointers,visual-c++,function-pointers,member-function-pointers,C++,Pointers,Visual C++,Function Pointers,Member Function Pointers,让我通过一个例子(使用VS2013的VC++代码)来解释我的问题 在这个代码段的最后一行 abcObj1->fp();//编译错误 我得到编译错误 错误C2064:项不计算为具有0个参数的函数 另外,如果我将鼠标悬停在“abcObj1->fp()”上,会出现一个红色错误 表观调用括号前面的表达式必须具有 (指向-)函数类型的指针 在这里,我可以调用函数“abcObj1->outpp();这在任何课程之外。 因此,我知道出现此错误的原因是,“abcObj1->fp();”中的函数地址属于类成员函数

让我通过一个例子(使用VS2013的VC++代码)来解释我的问题

在这个代码段的最后一行

abcObj1->fp();//编译错误

我得到编译错误

错误C2064:项不计算为具有0个参数的函数

另外,如果我将鼠标悬停在“abcObj1->fp()”上,会出现一个红色错误

表观调用括号前面的表达式必须具有 (指向-)函数类型的指针

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

我还提到了链接 但我无法解决编译错误

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

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

fp = &Dllclas::dllFunc; // This will compile
第二个问题更难解决:回想一下,为了调用成员函数,您需要两件事:

  • 指向函数的指针,以及
  • 对其调用函数的对象
因此,您还需要
Dllclas
类型的“目标”对象:

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

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

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

(x->*f)();
由于成员指针的名称(在
\u tmain
中)是
abcObj->fp
,因此需要使用

(abcObj->*(abcObj->fp))();
您可以通过向
Abc
添加另一个成员来简化,如

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

我找不到
FP
成员。你是说
FP
?是的,它是“FP”而不是“FP”(打字错误),我很抱歉。刚刚更正了。谢谢。
fp
是指向
Dllclas
成员的指针。您需要一个
Dllclas
实例来调用该成员,就像您不能在没有
Dllclas
实例的情况下直接调用
dllFunc
一样。
void callFP()
{
   (*fp)();
}