1

私はすでに自分の問題について尋ねましたが、今は次のステップにいます。以下のコードでは、常に EventHandler (Server::HandleMessage) を静的にしなければならないという問題があります。ただし、Handler 内から Server クラスの他の変数にアクセスするには、非静的にする必要があります。

どうすればこれを達成できますか?

ここに私のコード:

#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) は初めてです。

4

1 に答える 1

2

これがあなたが求めているものだと確信しています。希望する方法でthisメンバーへのポインターを呼び出すときは、明示的に暗黙的にバインドする必要があります。std::function

#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
于 2013-10-16T03:30:44.900 に答える