У меня есть два класса A и B. Я хочу передать имя функции в классе A в качестве параметра функции в классе B. Я пробовал с приведенным ниже образцом, это правильный способ.

class A
{
  public:
  B m_b;

  void MyFun()
  {
      // do something
  }

  void Test()
  {
  m_b.Process( MyFun );
  } 
}


class B
{
 public:
 void Process( void (*f)() )
 {
   (*f)();
 }
}

Заранее спасибо

0
Riskhan 3 Мар 2012 в 13:06

3 ответа

Лучший ответ

Поскольку MyFun является функцией-членом класса A, вам понадобится указатель на член вместо обычного указателя функции, а также вам понадобится экземпляр класса A для вызова функции. на:

class B
{
 public:
 void Process(A *obj, void (A::*f)() )
 {
   (obj->*f)();
 }
}
3
casablanca 3 Мар 2012 в 09:12

Фактически, если MyFun не является статическим членом вашего класса, у него есть скрытый аргумент типа A*, поэтому это реализовано следующим образом: m_a.MyFun(...) = ~ MyFunImpl(&m_a, ...) .

Итак, вы, вероятно, хотите иметь статическую функцию MyFun (вы не можете использовать this внутри нее) и внутри B::Process вызова f().

Если вам нужно передать this, обратитесь к ответу casablanca (указатели на функции-члены).

В противном случае, если вы хотите передать аргумент, вы можете выполнить поиск std::bind или лямбда-функций (C ++ 0x) или boost::bind до этого.

1
Benoit 3 Мар 2012 в 09:11

Следуйте советам здесь: http: // www. parashift.com/c++-faq-lite/pointers-to-members.html#faq-33.4, вы получите следующее:

class A;
typedef void (A::*MemFun)();

class B 
{ 
 public: 
 void Process(A& a, MemFun mf) 
 { 
   (a.*mf)(); 
 } 
}; 

class A 
{ 
  public: 
  B m_b; 

  void MyFun() 
  { 
    // do something 
  } 

  void Test() 
  { 
    MemFun p = &A::MyFun;
    A a;
    m_b.Process(a, p); 
  }  
};
1
Sami 3 Мар 2012 в 09:26