c++ - 如何 : Class functions pointers (C++)

标签 c++ class function-pointers

我在理解函数指针方面遇到了一些问题。尽管我已经阅读了很多关于此的主题,但我仍然对以下案例有疑问。

我的例子很简单——我有一个操纵杆类,它有一些函数指针以及可以分配这些指针的函数,但我不知道如何正确地做到这一点。

我会尽量保持简单:

class Joystick {
    void (Player::*OnShootKeyPressed)();  // pointer that takes no arguments and returns nothing

    void SetCallback(void (Player::*f)) {
       OnShotKeyPressed = f;
    }
}

class Player {
   void OnShootAction() { ...do the shooting...}

   void Initialize() {
      Joystick* joy = pInputMng->GetJoystick();

      joy->SetCallback( &Player::OnShootAction() );
   }
}

--在 Captain Obvlious 评论后编辑--

这是我想要实现的一个简短示例,但我似乎没有正确理解这些函数指针。我做错了什么?

我提前感谢所有帮助!

最佳答案

我喜欢函数指针。我认为他们是我最好的私有(private) friend 。但这可能不是他们的时候。当整个对象来回调用时,只需传递对象即可。

如果您需要对象之间更好的解耦,请构建一个接口(interface)。我会选择接口(interface)路由,因为为什么不呢?一旦你看到了困难的方法,简单的方法就容易了。

首先,为操纵杆的用户定义一个接口(interface)

class ButtonUser
{
    virtual void OnShootAction() = 0; // function to be implemented by children
    virtual void OnJumpAction() = 0; 
    virtual void OnDeathBlossomAction() = 0; 
    ...
}

现在是一个使用按钮界面并且对播放器一无所知的操纵杆

class Joystick {
    ButtonUser * pUser;

    void SetCallback(ButtonUser * puser) {
        pUser = puser;
    }
    void OnKeyPressed(key) {
        if (pUser != NULL) {
            switch( key ) {
                 case SHOOT: 
                     pUser->OnShootAction(); 
                     break;
                 case JUMP: 
                     pUser->OnjumpAction(); 
                     break;
                 case DB: 
                     pUser->OnDeathBlossomAction(); 
                     break;
                 ...
            }
        }
    }
}

Player 将自己安装为 Joystick 的用户

class Player: public ButtonUser{
    void OnShootAction() { ...do the shooting...}
    void OnJumpAction() {...jump...}; 
    void OnDeathBlossomAction() {...blow $#!+ up!...}
    ...

    void Initialize() {
    Joystick* joy = pInputMng->GetJoystick();

    joy->SetCallback( this );
}

关于c++ - 如何 : Class functions pointers (C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32193009/

相关文章:

c++ - 使用 std::function 时的额外复制构造函数

c++ - 为什么 parent->left 不持久

class - 在类和结构之间选择

java - 在调用 super 构造函数之前检查变量的有效性

python - 类变量的 Getter 或 Property 函数

c - 传递函数是否通过引用传递?

c++ - 通过函数指针传递给可变参数函数的参数改变它们的值

java - Java 和 C++ 运算符之间有什么区别吗?

c++ - 使用 `cstdarg` 中的宏访问普通函数参数是否合法?

C++ Boost.Serialization - 用户定义成员的非侵入式序列化?