C++ 事件处理 - const 问题

标签 c++ events static handler

我已经问过我的问题,现在我正在进行下一步。在下面的代码中,我遇到了问题,我总是必须将 EventHandler (Server::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 调用指向成员的指针时,您需要显式绑定(bind)隐式 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

关于C++ 事件处理 - const 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19394539/

相关文章:

python - ctypes - 从 C++ 函数获取输出到 Python 对象

iphone - 从 C++ 验证 iphone 收据

创建一个静态库并链接到它

c# - 通用静态类有多个实例?

c++ - 菱形继承(钻石问题)问题

c++ - 片段着色器中的 OpenGL 点 Sprite 旋转

node.js - Hyperledger Fabric registerChaincodeEvent() 方法未从链代码获取事件

C++ - 为什么不能使用 'const' 限定符创建静态成员函数

c# .Net CF Form.Invoke 引发 ArgumentException

c# - 在自定义 TextBox 上添加自定义 OnTextChange 事件处理程序