Используя указатель функции членства в классе

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

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 (нечто, панель)", говоря: "термин не оценивает к функции, берущей 2 аргумента". Что я делаю неправильно?

8
задан neuviemeporte 24 May 2010 в 05:02
поделиться

5 ответов

Нужный вам синтаксис выглядит так:

((object).*(ptrToMember)) 

Итак, ваш вызов будет следующим:

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

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

(this->*func)(foo, bar);
19
ответ дан 3 November 2019 в 13:35
поделиться

Для вызывать функции-члены через указатель:

(this->*func)(foo, bar);
6
ответ дан 3 November 2019 в 13:35
поделиться

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

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

0
ответ дан 3 November 2019 в 13:35
поделиться

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

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;
}
4
ответ дан 3 November 2019 в 13:35
поделиться

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

1
ответ дан 3 November 2019 в 13:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: