gpt4 book ai didi

c++ - 将成员函数指针作为参数传递?问答

转载 作者:行者123 更新时间:2023-11-28 03:04:32 29 4
gpt4 key购买 nike

我正在尝试做一些我认为非常简单的事情——传递一个队列和一个函数,并将该函数应用于队列中的每个项目——但我无法编译它。

class Foo
{
public:
void doStuff();
void doStuffOnBars(std::queue<Bar*> &bars, void (*func)(Bar &bar));
virtual void stuff(Bar &bar) = 0;

std::queue<Bar*> _bars;
};

void Foo::doStuff()
{
doStuffOnBars(_bars, stuff);
}

void Foo::doStuffOnBars(std::queue<Bar*> &bars, void (*func)(Bar &bar))
{
while (!bars.empty())
{
func(*bars.front());
bars.pop();
}
}

doStuffOnBars(_bars, stuff)doStuffOnBars(_bars, this->stuff)返回 C3867。

doStuffOnBars(_bars, &stuff)doStuffOnBars(_bars, &this->stuff)返回 C2276。

doStuffOnBars(_bars, &(Foo::stuff))void doStuffOnBars(std::queue<Bar*> &bars, void (Foo::*func)(Bar &bar))返回 C2064。

所以我完全没有想法。我见过的所有函数指针示例似乎都神奇地起作用了——我认为它们中的大多数都在全局范围内?为什么这与成员函数不同?

最佳答案

在我问它之前,我设法自己弄清楚了(经过一些咬指甲和拉头发之后)。我会把工作代码贴出来供其他人引用:

class Foo
{
public:
void doStuff();
void doStuffOnBars(std::queue<Bar*> &bars, void (Foo::*func)(Bar &bar));
virtual void stuff(Bar &bar) = 0;

std::queue<Bar*> _bars;
};

void Foo::doStuff()
{
doStuffOnBars(_bars, stuff);
}

void Foo::doStuffOnBars(std::queue<Bar*> &bars, void (Foo::*func)(Bar &bar))
{
while (!bars.empty())
{
(this->*func)(*bars.front());
bars.pop();
}
}

函数必须用(this->*func)调用——函数需要一个对象引用(this)并且函数需要被取消引用(它是毕竟是一个指针)。现在我知道了,这似乎很明显而且很有道理!!但是我认为,如果您不熟悉使用函数指针,那么它会引起一些困惑 - 这就是我发布此答案的原因。

关于c++ - 将成员函数指针作为参数传递?问答,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20038458/

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