C++: как передать указатель на функцию-член другого класса?

Как должна выглядеть подпись для функции Foo() для класса classA, когда я хочу передать указатель на функцию, которая является членом classB? Функция update() вызывается по запросу classB и получает объект classA. Внутри update() функции Foo() из classA должен быть передан указатель на функцию обратного вызова. Эта функция является членом classB. Я не могу сделать ничего статичного здесь. Есть ли способ сделать это, может быть, с помощью boost::function?

Код:

class classA
{
 public:
  voif Foo(/*a pointer to a memberfunction of ClassB*/)
};

class classB
{
 classB(){nVal = 0;}
 int nVal;
 public:
 void increment(int n){nVal += n;}
 void update(classA objA)
 {
  objA.Foo(increment)
 }
};

person tzippy    schedule 01.08.2014    source источник
comment
Используйте наследование и виртуальные функции. Для этого и существует этот механизм.   -  person barak manos    schedule 01.08.2014
comment
Вы можете прочитать о std::function и std::bind.   -  person Some programmer dude    schedule 01.08.2014
comment
@JoachimPileborg: Спасибо. Я не знал о std::function и std::bind.   -  person user3335    schedule 01.08.2014
comment
@barakmanos: В приведенном выше случае, как именно наследование поможет, когда типы classA и classB явно различны, а Foo() в classA просто берет ссылку на какой-то вызываемый объект?   -  person thokra    schedule 01.08.2014


Ответы (1)


Вы можете использовать boost::bind с boost::function.

class classA
{
public:
   void Foo(const boost::function<void(int)>& function)
   {
   }
};

class classB
{
public:
   //
   void update(classA objA)
   {
       objA.Foo(boost::bind(&classB::increment, this, _1));
   }
};
person ForEveR    schedule 01.08.2014
comment
Спасибо, это сделало работу! - person tzippy; 01.08.2014