繁体   English   中英

HOW TO:类函数指针(C ++)

[英]HOW TO: Class functions pointers (C++)

我在理解函数指针时遇到一些问题。 尽管我已经阅读了很多有关此主题的文章,但是在后续案例中还是有问题。

我的例子很简单-我有一个摇杆类,其中包含一些函数指针以及可以通过这些函数指针分配功能的函数,我不知道如何正确执行此操作。

我会尽量保持简单:

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() );
   }
}

-上尉评论后编辑-

那只是我想要实现的简短示例,而且我似乎不太了解这些函数指针。 我究竟做错了什么?

我先感谢所有帮助!

我喜欢函数指针。 我认为他们是我最好的私人朋友之一。 但这可能不是他们的时间。 当您有整个对象来回调用时,只需传递对象即可。

如果需要在对象之间进行更大的去耦,请构建一个接口。 我将使用接口路由,因为为什么不呢? 一旦您了解了困难的方法,简单的方法就很容易。

首先,为操纵杆的用户定义一个界面

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;
                 ...
            }
        }
    }
}

播放器将自己安装为游戏杆的用户

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 );
}

正确的代码和答案

1.)我遇到了问题中未提及的名称空间问题,因此无法创建函数。

这两个类都在名称空间下,因此分配函数指针的函数被拒绝:

void                        SetCallback(void (ehJoystick::*f)())

要求改为:

void                        SetCallback(void (eg::ehJoystick::*f)())

但是随后,编译器不接受它前面的命名空间。 我以为我在其他地方做错了事,但是一直都有问题。

2)我不知道您需要一个对象引用来调用成员函数指针。 以下代码正确无误。

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

    void SetCallback(void (Player::*f)(), Player *p) {
        OnShotKeyPressed = f;
        pPlayer = p; // we need a reference to the object
    }
    void OnKeyPressed(key) {
        if( key == SHOOT && OnShootKeyPressed != NULL ) {
            (pPlayer->*OnShootKeyPressed)(); //that's how the function is called
        }
    }

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM