c++ - 如何将成员函数指针传递给采用常规函数指针的函数?

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

我有一个播放器类,看起来像这样(精简到这个问题所需的内容):

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/

相关文章:

c - 参数如何有类型但没有名称?

c++ - 如何在 std::function 中存储 std::sqrt

c - 具有可变数量参数的函数的指针

c++ - 头文件和库有什么区别?

c++ - extern "C"声明如何工作?

c - 指向返回结构指针的函数的指针

c - 将值从简单表复制到 C 代码中指定地址的结构中的表时出现问题

C++ 如何使用 ESC 按钮终止我的程序

c++ - 尝试使用欧拉定理打印前 5 个完美数字

C - 将 char 指针传递给函数的段错误