指向类成员功能的指针
Pointer to class member function
我有两个类,即消息传递和gameObject。每个gameObject对象都有一个消息传递实例,我需要在gameObject中指向函数的函数指针。
此外以下是gamecharacter对象(源自gameObject)的代码,将其称为消息传递实例的函数:
messaging->Register(GameCharacter::DoMessage);
这是我的消息传递类代码:
/// Allows an object to send and receive messages.
class Messaging : public Component, public ::Messaging
{
private:
// Forward declaration of GameObject
class GameObject {};
// Define the OnMessageType as a function pointer to a function
// taking Message as parameter and returning void.
typedef void (GameObject:: *OnMessageType)(Message);
// OnMessage function pointer;
OnMessageType OnMessage;
public:
// Assign a function to the function pointer
void Register(OnMessageType func) { OnMessage = func; }
// Forward the Message to the function pointed to by the function pointer
void DoMessage(Message msg) { (this->*OnMessage)(msg); };
};
GameObject类:
class GameObject
{
public:
/// Unique number used for identification
int id;
/// Reference to the graphical model displayed by this object
int modelReference;
/// GameObject children
std::vector<GameObject> children;
/// Constructor
GameObject();
/// Destructor
~GameObject();
/// Add a child GameObject node
void AddChild(GameObject child);
/// Update Object
virtual void Update();
/// Handles received messages
//virtual void DoMessage(Message msg);
// Provide pointers to all possible components
Components::Transform* transform;
Components::RigidBody* rigidBody;
Components::Messaging* messaging;
// Pointer to message queue
//std::vector<Message> *msgQueue;
private:
/// Send message
void SendMessage(Message msg);
};
GameObject对象将带有onMessage指向的函数的调用寄存器。然后,当domessage称为domessage时,应调用gameObject指向的函数。因此,在这种情况下,呼叫domessage(在Gamecharacter的消息传递实例中)反过来又应在GameCharacter对象中呼叫Domessage。
问题是我在Domessage(消息MSG)函数上遇到此错误:
指向成员类型的指针 (组件:: Messaging :: GameObject :)(消息)'与 对象类型'组件::消息传递'
我可以收集对指针功能类型的不满意。我已经阅读了(在堆栈溢出帖子上),当调用指针函数时,应该指定成员函数所属的类型,但我找不到如何做到这一点...
任何人都可以阐明这一点,并解释如何修复我的代码?
将std::function
与std::bind
一起使用,而不是功能指针。您收到此错误的原因是您没有接收函数调用的对象,但您只有一个函数。如果您需要通过其指针调用成员函数,则必须保留两件事:
- 功能指针
- 您保留的成员功能指针的类的对象
实现您想要的最佳方法是将std::function
与std::bind
一起使用。示例:
using namespace std::placeholders;
GameCharacter gameCharacter;
messaging->Register(std::bind(GameCharacter::DoMessage, gameCharacter, _1));
和Messaging
类必须接受std::function<void(Message)>
对象类型。
class Messaging : public Component, public ::Messaging
{
private:
// Forward declaration of GameObject
class GameObject {};
// Define the OnMessageType as a function pointer to a function
// taking Message as parameter and returning void.
//typedef void (GameObject:: *OnMessageType)(Message);
typedef std::function<void(Message)> OnMessageType;
// OnMessage function pointer;
OnMessageType OnMessage;
public:
// Assign a function to the function pointer
void Register(OnMessageType func) { OnMessage = func; }
// Forward the Message to the function pointed to by the function pointer
void DoMessage(Message msg) { this->OnMessage(msg); };
};
Messaging
不能从GameObject
继承,因此您不能使用this
实例来调用OnMessage
。
您需要GameObject
的实例来调用成员方法。
GameObject gameObject;
(gameObject.*OnMessage)(msg);
// or (gameObject.*this->OnMessage)(msg);
,但不确定这是您想做的。
也许您真的想要std::function<void(Message )>
...
- 链表删除功能的单指针 // 是可能的
- 对于非常量指针类型的参数,未调用具有常量指针模板类型参数的功能
- char* 除了作为C++中的指针之外,还有其他功能吗?
- 具有小对象优化功能的智能指针
- 如何定义和设置指向模板类方法的功能指针
- 将状态传递给功能指针
- 如何使用指针向量为班级制作复制功能
- 我对C 中共享指针列表进行排序的功能未完成类型
- 如何使用结构内的功能指针调用私有函数
- 如何将自己的智能指针传递到功能
- 模板功能以检查智能指针是否为空
- 如何存储指针以功能模板,该模板将可呼叫对象作为其参数之一
- 功能指针不起作用(C )
- 将C 方法作为功能指针传递
- 字符指针功能以复制C 中的字符串
- 指针?指针功能
- 反向指针功能问题
- 无效指针功能的输出
- 更好地解释C++指针功能
- 用memcpy c 读取并写入指针功能