-1
我是一个有点生疏的程序员,并且是C++的新手。我被要求编写一个程序,可以将指向函数的指针传递给另一个函数并执行。我可以使简单的案例工作,其中一切都在.cpp文件中。但是,当我将代码放入.h文件中的类中时,它将不会编译。我要么是代码盲目的,要么缺少一些东西传递函数的指针在简单的情况下工作,但在“class”化之后不起作用
这里是工作的代码:
/*
* funcptr.cpp
*
* Example:
* - pass function pointer as argument
* - execute passed function
*/
#include <stdio.h>
void takes_a_function(void (*f)(void *data), void *data);
void print_char(void *data);
void print_int(void *data);
// This function gets passed (to takes_a_function)
void print_char(void *data) {
char *ch = (char *)data;
printf("%c\n", *ch);
}
// This function gets passed (to takes_a_function)
void print_int(void *data) {
int *i = (int *)data;
printf("%d\n", *i);
}
void takes_a_function(void (*f)(void *), void *data) {
//f(data); // this also works
(*f)(data);
}
int main() {
int i = 100;
takes_a_function(print_int, &i);
char ch = 'A';
takes_a_function(print_char, &ch);
}
它编译和运行:
# g++ funcptr.cpp -o funcptr
# ./funcptr
100
A
到目前为止好。但后来我把代码放到.h文件和“阶级”化,所以我可以在任何地方使用它,一切都分崩离析:
#ifndef __funcptr_h__
#define __funcptr_h__
#include <stdio.h>
void takes_a_function(void (*f)(void *data), void *data);
void print_char(void *data);
void print_int(void *data);
void testit();
class FunctionPtr
{
public:
// This function gets passed (to takes_a_function)
void print_char(void *data) {
char *ch = (char *)data;
printf("%c\n", *ch);
}
// This function gets passed (to takes_a_function)
void print_int(void *data) {
int *i = (int *)data;
printf("%d\n", *i);
}
void takes_a_function(void (*f)(void *a), void *data) {
//f(data); // this also works
(*f)(data);
}
void testit() {
int i = 100;
takes_a_function(print_int, &i);
char ch = 'A';
takes_a_function(print_char, &ch);
}
};
#endif
编译器错误是:
# g++ funcptr.h
funcptr.h: In member function ‘void FunctionPtr::testit()’:
funcptr.h:34:33: error: invalid use of non-static member function ‘void FunctionPtr::print_int(void*)’
takes_a_function(print_int, &i);
^
funcptr.h:22:7: note: declared here
void print_int(void *data) {
^~~~~~~~~
funcptr.h:37:35: error: invalid use of non-static member function ‘void FunctionPtr::print_char(void*)’
takes_a_function(print_char, &ch);
^
funcptr.h:16:7: note: declared here
void print_char(void *data) {
^~~~~~~~~~
我一直在玩这个游戏一段时间,并对传递函数指针(包括StackOverflow)做了大量的阅读,但是我看到的所有示例都很简单,没有任何帮助。
任何见解都非常感谢。 感谢所有。
这不是一个指向函数了...这是一个**成员函数指针** ... [阅读](https://isocpp.org/wiki/faq/pointers-to-members)。 – donkopotamus
'#define __funcptr_h__'是一个保留符号,因此定义它有未定义的行为。 – user2079303
[在C++标识符中使用下划线的规则是什么?](https://stackoverflow.com/questions/228783/what-are-the-rules-about-using-an-underscore-in-ac-identifier ) – user4581301