嗨,这是我第一次在C++中传递函数指针。所以这是我的代码:-
#include <iostream>
using namespace std;
// Two simple functions
class student
{
public:
void fun1() { printf("Fun1n"); }
void fun2() { printf("Fun2n"); }
// A function that receives a simple function
// as parameter and calls the function
void wrapper(void (*fun)())
{
fun();
}
};
int main()
{ student s;
s.wrapper(s.fun1());
s.wrapper(s.fun2());
return 0;
}
最初在包装函数中,我只传递了 fun1 和 fun2。我收到错误
try.cpp:22:15: error: ‘fun1’ was not declared in this scope
s.wrapper(fun1);
^~~~
try.cpp:23:15: error: ‘fun2’ was not declared in this scope
s.wrapper(fun2);
后来我尝试传递 s.fun1() 和 s.fun2() 作为参数,但再次出现错误
try.cpp:23:23: error: invalid use of void expression
s.wrapper(s.fun1());
^
try.cpp:24:23: error: invalid use of void expression
s.wrapper(s.fun2());
请帮忙我不知道该怎么办:(
让我们在帖子中处理这两个问题。
-
你打电话给
fun1
和fun2
.由于它们的返回类型是void
,因此不能将它们的结果作为某物的值传递。特别是作为函数指针的值。您也无法使用 dot 成员访问运算符获取其地址。这就引出了以下内容。 -
成员函数与常规函数不同。你不能只拿他们的地址。它们的处理是特殊的,因为成员函数只能在对象上调用。因此,它们有一个特殊的语法,涉及它们所属的类。
以下是您将如何做您所追求的事情:
class student
{
public:
void fun1() { printf("Fun1n"); }
void fun2() { printf("Fun2n"); }
// A function that receives a member function
// as parameter and calls the function
void wrapper(void (student::*fun)())
{
(this->*fun)();
}
};
int main()
{ student s;
s.wrapper(&student::fun1);
s.wrapper(&student::fun2);
return 0;
}