2017-07-22 23 views
-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)做了大量的阅读,但是我看到的所有示例都很简单,没有任何帮助。

任何见解都非常感谢。 感谢所有。

+3

这不是一个指向函数了...这是一个**成员函数指针** ... [阅读](https://isocpp.org/wiki/faq/pointers-to-members)。 – donkopotamus

+2

'#define __funcptr_h__'是一个保留符号,因此定义它有未定义的行为。 – user2079303

+0

[在C++标识符中使用下划线的规则是什么?](https://stackoverflow.com/questions/228783/what-are-the-rules-about-using-an-underscore-in-ac-identifier ) – user4581301

回答

-1

它在我看来像你的问题是,当你调用与你的论点takes_a_function。 您将数据参数声明为void类型的指针,而不是对void类型的引用。 你可以尝试这样的:

void testIt() { 
    int i = 100; 
    int * j = &i; 
    takes_a_function(print_int, j); 
    char c = 'a'; 
    char * d = &c; 
    takes_a_function(print_char, d); 
}; 

引用和指针是不完全一样的东西。

而且它看起来像你忘了#endif后您定义__funtptr_h__

我希望这有助于

相关问题