【问题标题】:C++: Using function pointers with member functionsC++:使用带有成员函数的函数指针
【发布时间】:2011-10-27 18:16:20
【问题描述】:

我正在尝试将一个函数作为参数传递给另一个函数,而它们恰好是同一个类的成员函数。

我遇到了一个奇怪的错误,我不知道问题出在哪里。

这是我的功能:

void myClass::functionToPass()
{
   // does something
}

void myClass::function1(void (*passedFunction)())
{
   (*passedFunction)();
}

void myClass::function2()
{
   function1( &myClass::functionToPass );
}

但是,我收到以下错误:

   cannot convert parameter 1 from 'void(__thiscall myClass::*) (void)' 
   to 'void(__cdecl*)(void)'

那是什么?我觉得我已经尝试了每一种变化来试图让它发挥作用。你甚至可以为成员函数传递函数指针吗?我怎样才能让它工作?

注意:将 functionToPass 设为静态并不是真正有效的选项。

【问题讨论】:

  • 错误消息为您提供了解决问题所需的所有信息。
  • 使用boost::function 可能比使用函数指针更容易。你必须检查是否应该是boost::function<void(void)>(在这种情况下function2应该绑定this)或boost::function<void(MyClass&)>(在这种情况下function1应该通过*this

标签: c++ function-pointers member-function-pointers


【解决方案1】:

正如其他人所指出的,您的错误在于传递的函数指针的类型。应该是void (myClass::*passedFunction)()

这是一个很好的tutorial,关于在 C++ 中使用指向成员函数的指针。

【讨论】:

  • 抱歉,我错过了您将函数指针传递给同一类的成员函数的事实。我以为你将它传递给其他函数,在这种情况下,你需要一个 myClass 的对象来实际调用 passedFunction 指向的函数。
【解决方案2】:

您可以将函数指针传递给成员函数。但这不是您的代码正在做的事情。您对常规函数指针(void (*passedFunction)() 是常规函数指针)和指向成员函数的指针(&myClass::functionToPass 是指向成员函数的指针)感到困惑。它们不是一回事,也不兼容。

你可以像这样重写你的代码

void myClass::function1(void (myClass::*passedFunction)())
{
   (this->*passedFunction)();
}

现在您的代码正在使用指向成员函数的指针,但这当然意味着您将无法传递常规函数指针。

【讨论】:

  • 有道理!直到明天我才有机会对此进行测试,但如果成功了,我肯定会接受。
猜你喜欢
  • 1970-01-01
  • 2018-09-12
  • 2012-02-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多