将成员函数作为参数传递错误:";必须调用对非静态成员函数的引用; 我是C++的新手,想知道一个类的成员函数如何传递给另一个函数,函数用一个函数指针作为参数。对于我尝试的代码,我得到了错误“必须调用对非静态成员函数的引用”

将成员函数作为参数传递错误:";必须调用对非静态成员函数的引用; 我是C++的新手,想知道一个类的成员函数如何传递给另一个函数,函数用一个函数指针作为参数。对于我尝试的代码,我得到了错误“必须调用对非静态成员函数的引用”,c++,C++,编辑:使函数为静态可以解决这个问题,但是我将无法访问类中定义的变量 file.cpp: #include "fooHdr.h" class bar { void clbck() { // Do something } void init() { foo(clbck()); } }; 成员函数指针不同于普通函数指针。普通函数指针如下所示: (pBar->*hndlr)(); void

编辑:使函数为静态可以解决这个问题,但是我将无法访问类中定义的变量

file.cpp:

#include "fooHdr.h"
class bar {
    void clbck() 
    {
       // Do something 
    }
    void init()
    {
        foo(clbck()); 
    }
};

成员函数指针不同于普通函数指针。普通函数指针如下所示:

(pBar->*hndlr)();
void foo(){}
void(*Func)(=foo;//函数指针。
成员函数指针如下所示:

(pBar->*hndlr)();
类成员测试{
公众:
void foo(){}
};
void(MemberTest::*Func)(=&MemberTest::foo;//成员函数指针。注意这里的“&”操作符。
int main()
{
试验;
(test.*Func)(;//这是如何调用成员函数指针。
}
因此,对于您的问题,您需要将其定义为成员函数指针,而不是普通函数指针:

void foo(void(bar:*hndlr)();
调用
foo()
函数时,它必须返回成员函数的地址:

void init()
{
foo(和bar::clbck);
}
但是,仍然不能像这样从
foo()
调用函数,因为它没有
bar
对象的当前实例。因此,我们必须创建另一个参数,该参数将指针指向当前对象:

void foo(bar*pBar,void(bar:*hndlr)();
...
foo(this,&bar::clbck);
现在,当从
foo()
调用成员函数时,您可以这样做:

(pBar->*hndlr)();

注意:在函数
foo()
顶部添加一个向前声明,否则编译器可能会抱怨
bar
未定义。

clbck()的返回类型为
void
,因此不能在任何地方将其用作参数。你可能想写
foo(clbck),但这是一个类成员函数,它需要声明为
静态
类成员函数才能工作。还要注意,(指向)成员函数与(指向)非成员函数不同。所有这些都应该在任何或类中。@RemyLebeau谢谢你纠正我。我编辑了它。谢谢你的回答,但是foo()函数是一个给定的头函数,不能修改。@Cherbo如果你想将它传递给
foo
,那么你的
clbck()
需要标记为
static
。而且你不能做
foo(clbck()),你需要做
foo(clbck)