C++ 事件处理 - 与常量有关的问题

C++ Event Handling - issue with const

本文关键字:问题 常量 事件处理 C++      更新时间:2023-10-16

我已经问过我的问题,现在我正在下一步。在下面的代码中,我遇到了一个问题,即我总是必须使事件处理程序(服务器::HandleMessage)成为静态的。但是我需要让它非静态才能从处理程序中访问服务器类中的其他变量。

我怎样才能做到这一点?

这是我的代码:

#include <iostream>
#include <functional>
using namespace std;
class Client{
    public:
        struct MessageReceiveArgs {
            MessageReceiveArgs(int ID, const std::string& Text) : ID(ID), Text(Text) {}
            int ID;
            std::string Text;
        };
        std::function<void(MessageReceiveArgs)> onMessageReceive;
        Client(){}
        void FireEvent(){
            this->onMessageReceive(MessageReceiveArgs(16, "SomeText"));
        }
};
class Server{
    public:
        int i;
        Server(){
            this->client.onMessageReceive = &Server::HandleMessage;
            this->i = 5;
        }
        void FireEvent(){
            this->client.FireEvent();
        }
        Client client;
        static void HandleMessage(Client::MessageReceiveArgs args) {
            std::cout<<"ID "<<args.ID<<": "<<" "<<args.Text<<std::endl;
            //need it non static
            //std::cout<<"I: "<<this->i<<std::endl;
        }
};
int main() {
    Server sv = Server();
    sv.FireEvent();
}

正如我在之前的帖子中提到的,我是标准C++(Unix)的新手。

我很

确定这就是你所追求的。在以您似乎想要的方式通过std::function调用指向成员的指针时,您需要显式绑定隐式this

#include <iostream>
#include <functional>
using namespace std;
class Client{
public:
    struct MessageReceiveArgs
    {
        MessageReceiveArgs(int ID, const std::string& Text) 
            : ID(ID), Text(Text) {}
        int ID;
        std::string Text;
    };
    Client(){}
    void FireEvent()
    {
        this->onMessageReceive(MessageReceiveArgs(16, "SomeText"));
    }
    std::function<void(MessageReceiveArgs)> onMessageReceive;
};

class Server
{
public:
    int i;
    Server()
    {
        this->client.onMessageReceive 
            = std::bind(&Server::HandleMessage, this, std::placeholders::_1);
        this->i = 5;
    }
    void FireEvent()
    {
        this->client.FireEvent();
    }
    Client client;
    void HandleMessage(Client::MessageReceiveArgs args)
    {
        std::cout<<"ID "<<args.ID<<": "<<" "<<args.Text<<std::endl;
    }
};
int main()
{
    Server sv = Server();
    sv.FireEvent();
}

输出

ID 16:  SomeText