![](/img/trans.png)
[英]How to create a class that stores pointers to member functions (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.