Использование указателя на функцию-член в классе - PullRequest
8 голосов
/ 24 мая 2010

Учитывая пример класса:

class Fred
{
public:
Fred() 
{
    func = &Fred::fa;
}

void run()
{
     int foo, bar;
     *func(foo,bar);
}

double fa(int x, int y);
double fb(int x, int y);

private:
double (Fred::*func)(int x, int y);
};

Я получаю ошибку компилятора в строке, вызывающей функцию-член через указатель "* func (foo, bar)", говоря: "термин не оцениваетсяфункция, принимающая 2 аргумента ".Что я делаю не так?

Ответы [ 5 ]

19 голосов
/ 24 мая 2010

Синтаксис, который вам нужен, выглядит следующим образом:

((object).*(ptrToMember)) 

Итак, ваш звонок будет:

((*this).*(func))(foo, bar);

Я полагаю, что альтернативный синтаксис будет:

(this->*func)(foo, bar);
6 голосов
/ 24 мая 2010

Для вызова функций-членов через указатель вам нужен следующий синтаксис:

(this->*func)(foo, bar);
4 голосов
/ 24 мая 2010

Есть две вещи, о которых нужно позаботиться. Сначала объявление типа указателя на функцию:

private:
  typedef double (Fred::*fptr)(int x, int y);
  fptr func;

Далее приводится синтаксис для вызова функции с помощью указателя:

(this->*func)(foo,bar)

Вот модифицированный пример кода, который будет скомпилирован и запущен:

#include <iostream>

class Fred
{
public:
  Fred() 
  {
    func = &Fred::fa;
  }

  void run()
  {
    int foo = 10, bar = 20;
    std::cout << (this->*func)(foo,bar) << '\n';
  }

  double fa(int x, int y)
  {
    return (double)(x + y);
  }
  double fb(int x, int y)
  {
  }

private:
  typedef double (Fred::*fptr)(int x, int y);
  fptr func;
};

int
main ()
{
  Fred f;
  f.run();
  return 0;
}
1 голос
/ 24 мая 2010

Функция-член с двумя аргументами - это действительно функция с тремя аргументами. «this» является неявным аргументом, поэтому вы получаете ошибку об отсутствии аргумента «this».

0 голосов
/ 24 мая 2010

Нестатические функции-члены класса скрыли этот указатель в качестве аргумента.

Я думаю, синтаксис (Это -> * FUNC) (Foo, бар) способ заставить компилятор понять, что он должен добавить это к функции.

...