C++ 是否将成员函数指针作为参数传递?问:;A.

C++ 是否将成员函数指针作为参数传递?问:;A.,c++,member-function-pointers,C++,Member Function Pointers,我正在尝试做一些我认为非常简单的事情——传递一个队列和一个函数,并将该函数应用于队列中的每个项目——但我无法编译它 class Foo { public: void doStuff(); void doStuffOnBars(std::queue<Bar*> &bars, void (*func)(Bar &bar)); virtual void stuff(Bar &bar) = 0; std::queue<Bar*&

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

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();
    }
}
class-Foo
{
公众:
void doStuff();
void dostufforbar(标准:队列和酒吧,void(*func)(酒吧和酒吧));
虚拟空白填充(条形和条形)=0;
标准::队列_条;
};
void Foo::doStuff()
{
Dostuffonbar(_酒吧,东西);
}
void Foo::dostuffonbar(标准::队列和酒吧,void(*func)(酒吧和酒吧))
{
而(!bar.empty())
{
func(*bar.front());
bar.pop();
}
}
dostuffinbar(\u条,填充物)
dostuffinbar(\u条,此->填充物)
返回C3867

dostuffinbar(\u bar,&stuff)
dostuffinbar(\u bar,&this->stuff)
返回C2276

dostuffinbar(_Bar,&(Foo::stuff))
with
void dostuffinbar(std::queue&Bar,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();
    }
}
class-Foo
{
公众:
void doStuff();
void dostufforbar(标准:队列和酒吧,void(Foo::*func)(酒吧和酒吧));
虚拟空白填充(条形和条形)=0;
标准::队列_条;
};
void Foo::doStuff()
{
Dostuffonbar(_酒吧,东西);
}
void Foo::dostuffonbar(标准::队列和酒吧,void(Foo::*func)(酒吧和酒吧))
{
而(!bar.empty())
{
(this->*func)(*bar.front());
bar.pop();
}
}
必须使用
(this->*func)
调用函数-函数需要对象引用(
this
),并且函数需要取消引用(毕竟它是一个指针)。现在我知道了,这看起来很明显,很有道理!!然而,我认为如果你对使用函数指针还不熟悉,那么它会引起一些混乱——这就是为什么我要发布这个答案的原因