Как передать функцию класса в качестве параметра другой функции того же класса? - PullRequest
1 голос
/ 17 августа 2010

Я в основном хочу использовать функцию 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 «нестандартная форма для получения адреса функции-члена»

EDIT:

Я звоню из:

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 ]

4 голосов
/ 17 августа 2010

Посмотрите, куда указывает ошибка. Могу поспорить, что дело не в строке объявления функции, а в том, как вы ее называете.

Обратите внимание:

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 голос
/ 17 августа 2010

Вы до сих пор не опубликовали код, в котором вы создаете указатель на член, в чем и заключается ошибка, но есть проблема с тем, как вы ее используете.

Чтобы использовать указатель начлен, вам нужно использовать один из операторов ->* или .* с указателем или ссылкой на соответствующий экземпляр класса.Например:

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 );
}

Обратите внимание, что для указателей на элементы вам нужно &, в отличие от обычных имен функций, которые неявно преобразуются в указатели на функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...