У меня есть класс игрока, который выглядит так (урезанный до необходимого для этой проблемы):
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 тиков. Вот функция, реализация не имеет значения:
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;
to
void (Player::*dPtr)() = &Player::death;
чтобы решить эту проблему. Но тогда мой вызов функции бездействия неверен, так как он принимает обычный указатель функции, а я передаю указатель функции-члена и, таким образом, выдает ошибку:
no matching function for call to 'Game::idle(void (Player::*&)(), int)'
Итак, мой вопрос: как я могу передать указатель функции-члена Player::*dPtr
в функцию ожидания, которая принимает void (*)()
в качестве аргумента?
Или есть другой способ решить мою предыдущую ошибку, которая запрещает мне использовать адрес неполной функции-члена для формирования указателя на функцию-член?
Game::idle
, и обе функции,kill
иdeath
, могли быть вызваны черезGame::idle
. Так что я придумалkill_player_delayed
как то, что вызываетGame::idle
. 16.03.2015std::function
! (Изобретать это, возможно, не так уж и хорошо) 16.03.2015std::function
, и я проголосую за него ;-) 16.03.2015