我有一个播放器类,看起来像这样(精简到这个问题所需的内容):
class Player
{
public:
Player();
~Player();
void kill();
void death();
void reset();
};
kill()
、death()
和 reset()
函数如下所示:
void Player::kill()
{
void (*dPtr)() = &death;
Game::idle(dPtr, 48);
}
void Player::death()
{
reset();
}
void Player::reset()
{
//resets
}
idle 函数是Game 的一个静态成员函数,它接受一个函数指针和一个整数n,并在n tick 之后调用该函数。这是函数,实现应该无关紧要:
class Game {
static void idle(void (*)(), int);
};
这段代码给我错误:
ISO C++ forbids taking the address of an unqualified or parenthesized non-static member function to form a pointer to member function. Say '&Player::death' [-fpermissive]
所以我改变行
void (*dPtr)() = &death;
到
void (Player::*dPtr)() = &Player::death;
解决这个问题。但是我对空闲函数的调用是不正确的,因为它需要一个常规函数指针,而我传入了一个成员函数指针,因此给出了错误:
no matching function for call to 'Game::idle(void (Player::*&)(), int)'
所以我的问题是:
如何将成员函数指针 Player::*dPtr
传递给空闲函数,该函数采用 void (*)()
作为参数?
或者是否有另一种方法可以解决我之前的错误,该错误禁止我获取不合格成员函数的地址以形成指向成员函数的指针?
最佳答案
另一个答案提到你需要两个指针。然而,C++ 已经带有用于执行此操作的容器,因此使用它们会使您的代码更简单。 (在 C++03 中,下面的一些 std::
项是 std::tr1::
)。
示例代码:
#include <iostream>
#include <functional>
struct Game
{
static void idle( std::function<void()> func, int x )
{ std::cout << "x = " << x << "\n"; func(); }
};
struct Player
{
void death() { std::cout << "player.death\n"; }
void kill() { Game::idle( std::bind(&Player::death, this), 48 ); }
};
int main()
{
Player p;
p.kill();
}
终身注意:std::bind
按值绑定(bind)。使用 *this
意味着制作了 Player
的拷贝并将其存储在 std::function
对象中,必要时随它一起复制。
使用 this
意味着函数对象存储一个指针,所以如果您实际将函数对象存储在 Game::idle
中,您必须注意这个 Player
在从 Game::idle
的列表中删除此函数对象之前不会被销毁。
关于c++ - 如何将成员函数指针传递给采用常规函数指针的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29065943/