gpt4 book ai didi

c++ - 指向成员函数的函数指针

转载 作者:太空狗 更新时间:2023-10-29 23:24:26 25 4
gpt4 key购买 nike

这个有几个重复但没有人解释为什么我可以使用成员变量来存储指针(在 FOO 中)但是当我尝试使用局部变量时(在 的注释部分) code>BAR),这是非法的。谁能解释一下?

#include <iostream>
using namespace std;

class FOO
{
public:
int (FOO::*fptr)(int a, int b);
int add_stuff(int a, int b)
{
return a+b;
}
void call_adder(int a, int b)
{
fptr = &FOO::add_stuff;
cout<<(this->*fptr)(a,b)<<endl;
}
};

class BAR
{
public:
int add_stuff(int a, int b)
{
return a+b;
}
void call_adder(int a, int b)
{
//int (BAR::*fptr)(int a, int b);
//fptr = &BAR::add_stuff;
//cout<<(*fptr)(a,b)<<endl;
}
};

int main()
{
FOO test;
test.call_adder(10,20);
return 0;
}

最佳答案

显然,您误解了 this->* 的含义在通话中FOO .

当您使用 this->* 时与成员(member)fptr指针,this->*部分与fptr完全无关成为 FOO 的成员.当您使用指向成员的指针调用成员函数时,您必须使用 ->*运算符(或 .* 运算符),您总是必须指定要与该成员指针一起使用的实际对象。这就是this->*调用表达式的一部分。 IE。调用将总是看起来

(<pointer-to-object> ->* <pointer-to-member>) (<arguments>)

或作为

(<object> .* <pointer-to-member>) (<arguments>)

不能省略调用的左侧(<pointer-to-object><object>)。

换句话说,fptr 是不是并不重要是成员变量、局部变量、全局变量或任何其他类型的变量,通过fptr调用将总是看起来

(this->*fptr)(a, b);

假设您想用 *this 调用它目的。再举一个例子,如果你想为指针 pfoo 指向的其他对象调用它,调用将如下所示

FOO *pfoo;
...
(pfoo->*fptr)(a, b);

在你的BAR类调用应看起来像 (this->*fptr)(a,b)尽管 fptr是局部变量。

关于c++ - 指向成员函数的函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2745872/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com