我在理解函数指针方面遇到了一些问题。尽管我已经阅读了很多关于此的主题,但我仍然对以下案例有疑问。
我的例子很简单——我有一个操纵杆类,它有一些函数指针以及可以分配这些指针的函数,但我不知道如何正确地做到这一点。
我会尽量保持简单:
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/