如何将类的函数作为参数传递给同一个类的另一个函数

时间:2010-08-17 19:33:41

标签: c++ class function-pointers member-function-pointers

我基本上想要使用dif函数来提取类(ac)的不同元素。

代码类似于:

·H:

class MyClass
{
  public:
    double f1(AnotherClass &);
    void MyClass::f0(AnotherClass & ac, double(MyClass::*f1)(AnotherClass &));
};

.CC:

double MyClass::f1(AnotherClass & ac)
{
  return ac.value;
}

void MyClass::f0(AnotherClass & ac, double(MyClass::*f1)(AnotherClass &))
{
  std::cout << f1(ac);
}

不起作用,它给错误#547“非标准形式获取成员函数的地址”

编辑:

我从以下地方致电:

void MyClass(AnotherClass & ac)
{
  return f0(ac,&f1);  // original and incorrect
  return f0(ac,&Myclass::f1); //solved the problem
}

但是,我还有另一个错误:

std::cout << f1(ac); 
             ^ error: expression must have (pointer-to-) function type

2 个答案:

答案 0 :(得分:4)

查看错误指向的位置。我打赌它不在函数声明行上,而是在你如何调用它。

观察:

struct foo
{
    void bar(void (foo::*func)(void));
    void baz(void)
    {
        bar(&foo::baz); // note how the address is taken
        bar(&baz); // this is wrong
    }
};

您收到错误是因为您错误地调用了该函数。鉴于上面的foo,我们知道这不起作用:

baz(); // where did the foo:: go?

因为baz需要调用实例。你需要给它一个(我假设this):

std::cout << (this->*f1)(ac);

语法有点奇怪,但是这个运算符->*说:“取右边的成员函数指针,并用左边的实例调用它。” (还有.*运算符。)

答案 1 :(得分:1)

您仍未发布创建指向成员的指针的代码,这是错误似乎的内容,但是您使用它的方式存在问题。

要使用指向成员的指针,您需要使用->*.*运算符之一,并使用指针或对类的相应实例的引用。 E.g:

void MyClass::f0(AnotherClass & ac, double(MyClass::*f1)(AnotherClass &))
{
  std::cout << (this->*f1)(ac);
}

您可以像这样调用函数:

void f()
{
    AnotherClass ac;
    MyClass test;
    test.f0( ac, &MyClass::f1 );
}

请注意,对于指向成员的指针,您需要&,这与通常隐式转换为函数指针的函数名称不同。