功能指针问题:传递和声明

时间:2011-07-25 20:47:34

标签: c++ function pointers function-pointers

嘿我正在试图弄清楚函数指针以及如何传递它们/声明它们,但是我在我的Button类构造函数中传递指针并将其成员函数指针设置为传递指针时遇到一些麻烦。

  • 当我写Button(Func1)Button1时,它说预期为';'
  • 当我写Button(Func1);它没有说明Button
  • 的默认构造函数
  • 当我写Button(& Func1);它说Func1需要一个初始化器
  • 当我写Button(& Func1())Button1;它说表达式必须是左值或函数指示符

我做错了什么?

void Func1(){std::cout << "This is a function\n";};
void Func2(){std::cout << "This is another function\n";};

class Button
{
private:
    void (*Func)(void);

public:
    void Activate(){ Func() ;};

    Button( void (*Function)(void)){
        this->Func = Function;};
};

Button(&Func1) Button1;
Button(&Func2) Button2;

Button1.Activate();
Button2.Activate();

2 个答案:

答案 0 :(得分:4)

此代码的语法错误:

Button(&Func1) Button1;
Button(&Func2) Button2;

应该是:

Button Button1(&Func1);
Button Button2(&Func2);

和函数指针声明:

void (*Func)(void);

在参数中保留无空格:

void (*Func)();

修改ideone上的工作示例。

答案 1 :(得分:1)

想想它:

return_type (*ptr_name)(arguments);

使用typedef通常最容易使它尽可能接近。例如:

void *(*f)(int);

可以改写为:

typedef void *ret_type;

ret_type (*f)(int);
当事情变得复杂时,这变得特别相关 - 例如,每当你做一些伪函数式编程,一个函数返回指向另一个函数的指针时,你几乎肯定想要使用typedef来保持两个直。

编辑:您还应该意识到您似乎正在尝试重新发明Command模式。您可能希望查看(例如) Modern C ++ Design 中命令模式的实现。