Передача имени функции в качестве параметра Другой функции в классе C ++ - PullRequest
0 голосов
/ 03 марта 2012

У меня есть два класса 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)();
 }
}

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

Ответы [ 3 ]

3 голосов
/ 03 марта 2012

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

class B
{
 public:
 void Process(A *obj, void (A::*f)() )
 {
   (obj->*f)();
 }
}
1 голос
/ 03 марта 2012

Следуйте советам здесь: 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 голос
/ 03 марта 2012

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

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

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

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

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