将成员函数作为参数传递错误:";必须调用对非静态成员函数的引用; 我是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)代码>。