指向类成员功能的指针

Pointer to class member function

本文关键字:指针 功能 成员      更新时间:2023-10-16

我有两个类,即消息传递和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::functionstd::bind一起使用,而不是功能指针。您收到此错误的原因是您没有接收函数调用的对象,但您只有一个函数。如果您需要通过其指针调用成员函数,则必须保留两件事:

  1. 功能指针
  2. 您保留的成员功能指针的类的对象

实现您想要的最佳方法是将std::functionstd::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 )> ...